Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/350.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 图像中黑色像素的随机化位置_Python_Numpy_Image Processing_Pixels - Fatal编程技术网

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个答案)