рандомизация расположения черных пикселей на изображении - PullRequest
0 голосов
/ 30 апреля 2018

Допустим, я генерирую изображение таким образом:

import cv2
import numpy as np
im = cv2.imread('target.jpg')
zzo = np.zeros(im.shape)
shp = (int(im.shape[0]),int(0.5*im.shape[1]),int(im.shape[2]))
zz = np.zeros(shp)
oo = 255*np.ones(shp)
cct = np.concatenate((zz,oo),1)
cv2.imshow('image',cct)
cv2.waitKey(0)
cv2.destroyAllWindows()

В результате получается изображение, наполовину белое и наполовину черное. Как я могу рандомизировать расположение черных и белых пикселей? Я пытался использовать функции numpy permutation и shuffle, но это никак не влияет на изображение. Переменная im является трехмерным массивом, и для рандомизации положений пикселей требуется перемещение объекта, имеющего три значения на пиксель (R, G, B), поэтому первый пиксель равен im[0,0,:], второй - im[0,1,:] и т. Д. на

Ответы [ 3 ]

0 голосов
/ 30 апреля 2018

Вы можете подумать, что можете использовать numpy.random.shuffle, но это перетасовывает только первое измерение. Для вашего изображения это будет перемешивать строки, а не все пиксели.

Вы можете использовать numpy.random.shuffle, если вы преобразуете свой массив из фигуры (m, n, 3) в (m * n, 3). Вы можете создать «представление» вашего массива, имеющего эту форму, и передать его numpy.random.shuffle. Это также перетасует ваш массив, потому что numpy.random.shuffle работает на месте. Так что после того, как вы напишите cct = np.concatenate((zz,oo),1), вы можете сделать

np.random.shuffle(cct.reshape(-1, 3))

В общем, это не сработает, потому что метод reshape может вернуть копию, и в этом случае приведенная выше строка будет перемешивать копию на месте, но не изменит оригинальный массив. В вашем случае вы только что создали cct, используя np.concatenate, поэтому массив является C-смежным, а cct.reshape(-1, 3) возвращает представление.

0 голосов
/ 30 апреля 2018

Тривиальный способ создания изображения с наполовину черными и наполовину белыми пикселями состоит в создании изображения со случайными значениями из равномерного распределения (какой бы метод и диапазон не были дешевы на вашей платформе), а затем пороговое значение этого изображения в половине диапазона. Это приведет к тому, что каждый пиксель с вероятностью 50% будет черным или белым.

Если вам действительно нужно ровно половину пикселей, будь то черный или белый, вам нужно будет рассчитать медиану и порог при этом. В этом случае перетасовка пикселей может быть дешевле (как в других 3 ответах).

0 голосов
/ 30 апреля 2018

Один простой способ - изменить одну длинную строку пикселей и перетасовать их:

>>> im2d = im.reshape(-1, im.shape[2])
>>> shuffle = np.random.permutation(im2d.shape[0])
>>> im2d[...] = im2d[shuffle]

Это перетасовывает пиксели im квази-на месте (фактически создает новый массив и копирует его обратно в im).

...