Как рандомизировать пиксели изображения в питоне - PullRequest
0 голосов
/ 21 сентября 2018

Я новичок в вычислительном видении и Python, и я не мог понять, что пошло не так.Я попытался рандомизировать все пиксели изображения в изображении RGB, но мое изображение оказалось совершенно неверным, как показано ниже.Может кто-нибудь, пожалуйста, пролить немного света?

from scipy import misc

import numpy as np
import matplotlib.pyplot as plt

#Loads an arbitrary RGB image from the misc library
rgbImg = misc.face()     

%matplotlib inline

#Display out the original RGB image 
plt.figure(1,figsize = (6, 4))
plt.imshow(rgbImg)
plt.show()

#Initialise a new array of zeros with the same shape as the selected RGB image 
rdmImg = np.zeros((rgbImg.shape[0], rgbImg.shape[1], rgbImg.shape[2]))
#Convert 2D matrix of RGB image to 1D matrix
oneDImg = np.ravel(rgbImg)

#Randomly shuffle all image pixels
np.random.shuffle(oneDImg)

#Place shuffled pixel values into the new array
i = 0 
for r in range (len(rgbImg)):
    for c in range(len(rgbImg[0])):
        for z in range (0,3):
            rdmImg[r][c][z] = oneDImg[i] 
            i = i + 1

print rdmImg
plt.imshow(rdmImg) 
plt.show()

исходное изображение
image

изображение моей попытки рандомизации изображения пикселя
image

Ответы [ 2 ]

0 голосов
/ 21 сентября 2018

Вы не тасуете пиксели, вы тасуете все, когда используете потом np.ravel() и np.shuffle().

Когда вы тасуете пиксели, вы должны убедиться, что цвет, RGB кортежи, оставайся таким же.

from scipy import misc

import numpy as np
import matplotlib.pyplot as plt

#Loads an arbitrary RGB image from the misc library
rgbImg = misc.face()

#Display out the original RGB image
plt.figure(1,figsize = (6, 4))
plt.imshow(rgbImg)
plt.show()

# doc on shuffle: multi-dimensional arrays are only shuffled along the first axis
# so let's make the image an array of (N,3) instead of (m,n,3)

rndImg2 = np.reshape(rgbImg, (rgbImg.shape[0] * rgbImg.shape[1], rgbImg.shape[2]))
# this like could also be written using -1 in the shape tuple
# this will calculate one dimension automatically
# rndImg2 = np.reshape(rgbImg, (-1, rgbImg.shape[2]))



#now shuffle
np.random.shuffle(rndImg2)

#and reshape to original shape
rdmImg = np.reshape(rndImg2, rgbImg.shape)

plt.imshow(rdmImg)
plt.show()

Это случайный енот, обратите внимание на цвета.Там нет красного или синего цвета.Только оригинальные, белые, серые, зеленые, черные.

enter image description here

Есть некоторые другие проблемы с вашим кодом, который я удалил:

  • Не используйте вложенные циклы, медленно.

  • Предварительное выделение с np.zeros не требуется (если оно вам когда-либо понадобится, просто введите rgbImg.shapeв качестве аргумента не нужно распаковывать отдельные значения)

0 голосов
/ 21 сентября 2018

Изменить plt.imshow(rdmImg) на plt.imshow(rdmImg.astype(np.uint8))
Это может быть связано с этой проблемой https://github.com/matplotlib/matplotlib/issues/9391/

...