Python 图像中黑色像素的随机化位置
假设我以这种方式生成图像:Python 图像中黑色像素的随机化位置,python,numpy,image-processing,pixels,Python,Numpy,Image Processing,Pixels,假设我以这种方式生成图像: 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('ima
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
是一个3D数组,随机化像素的位置需要移动一个每个像素有三个值的对象(R,G,B),因此像素一是im[0,0,:]
,像素二是im[0,1,:]
等等一个简单的方法是重塑int一条长线的像素,并将其洗牌:
>>> im2d = im.reshape(-1, im.shape[2])
>>> shuffle = np.random.permutation(im2d.shape[0])
>>> im2d[...] = im2d[shuffle]
这会将
im
的像素按原样洗牌(它实际上创建了一个新数组并将其复制回im
)。您可能认为可以使用numpy.random.shuffle
,但它只洗牌第一个维度。对于您的图像,这将洗牌行,而不是所有的像素
如果将数组的形状从(m,n,3)改为(m*n,3),则可以使用numpy.random.shuffle
。您可以创建具有此形状的数组的“视图”,并将其传递给numpy.random.shuffle
。这也将洗牌你的数组,因为numpy.random.shuffle
操作到位。所以在您编写了cct=np.concatenate((zz,oo),1)
之后,您就可以
np.random.shuffle(cct.reshape(-1, 3))
这在一般情况下不起作用,因为
重塑
方法可以返回一个副本,在这种情况下,上面的行将在适当的位置洗牌副本,但不会更改原始数组。在您的例子中,您刚刚使用np.concatenate
构造了cct
,因此数组是C-连续的,cct.reformate(-1,3)
返回一个视图。生成具有半黑半白像素的图像的简单方法是使用均匀分布的随机值创建图像(在你的平台上,无论什么方法和范围是便宜的),然后将该图像的阈值设置为该范围的一半。这将导致每个像素有50%的几率是黑色或白色
如果你真的需要一半的像素是黑色或白色的,你需要计算中间值和阈值。在这种情况下,洗牌像素可能更便宜(如其他3个答案)