随机化图像中黑色像素的位置

时间:2018-04-29 22:58:53

标签: 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('image',cct)
cv2.waitKey(0)
cv2.destroyAllWindows()

结果是半白半黑的图像。我如何随机化黑白像素的位置?我尝试使用numpy permutationshuffle函数,但这似乎对图像没有任何作用。变量im是一个3D数组,随机化像素的位置需要移动一个每像素有三个值的对象(R,G,B),因此像素一是im[0,0,:],像素二是{ {1}}等等

3 个答案:

答案 0 :(得分:3)

您可能认为可以使用DECLARE l_filename VARCHAR2 (1024); BEGIN l_filename := 'some value'; INSERT INTO aff_attach (file_id, file_name, mime_type, attachment, file_size) SELECT ID, l_filename, mime_type, blob_content,DOC_SIZE FROM apex_application_files WHERE filename = l_filename AND created_by = :app_user; END: ,但它只会改变第一个维度。对于你的图像,这会改变行,而不是所有的像素。

如果您将阵列从形状(m,n,3)重塑为(m * n,3),可以使用numpy.random.shuffle。您可以创建一个"视图"具有此形状的数组并将其传递给numpy.random.shuffle。这也会改变你的数组,因为numpy.random.shuffle就地运行。所以在你写完numpy.random.shuffle后,你可以做到

cct = np.concatenate((zz,oo),1)

这一般不会起作用,因为np.random.shuffle(cct.reshape(-1, 3)) 方法可以返回一个副本,在这种情况下,上面的行会将副本原位洗牌但是它不会改变原来的阵列。在您的情况下,您刚刚使用reshape构建了cct,因此数组是C连续的,np.concatenate返回一个视图。

答案 1 :(得分:0)

一种简单的方法是重新整形一行像素并将其改组:

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

这会使im准就地的像素混乱(它实际上会创建一个新数组并将其复制回im)。

答案 2 :(得分:0)

生成半黑色和半白色像素的图像的简单方法是使用来自均匀分布的随机值创建图像(无论方法和范围在您的平台上是否便宜),然后将图像的阈值设置为一半。这将导致每个像素有50%的机会为黑色或白色。

如果您确实需要半个像素为黑色或白色,则需要计算中位数和阈值。在这种情况下,改变像素可能会更便宜(如在其他3个答案中)。