如何随机化图像中黑白像素的位置?(附初始实现代码)
实现随机黑白像素分布的图像
我明白你想要把原本左右分块的黑白图像改成每个像素随机黑白分布的效果,之前用permutation和shuffle没成功,大概率是没处理好图像的三维维度(高度、宽度、通道)——这俩函数默认是沿单一轴打乱,没法直接实现单像素级的随机分布。下面给你两种靠谱的实现方式:
方式一:完全随机生成黑白像素
这种方式会让每个像素独立随机变成黑或白,代码简单直接:
import cv2 import numpy as np # 读取原图(主要是获取图像的尺寸) im = cv2.imread('target.jpg') # 生成和原图同形状的随机数组(值在0-1之间) rand_arr = np.random.rand(*im.shape) # 将随机值大于0.5的设为255(白色),小于等于的设为0(黑色),转成OpenCV需要的uint8类型 random_bw = (rand_arr > 0.5).astype(np.uint8) * 255 # 显示图像 cv2.imshow('Random Black & White', random_bw) cv2.waitKey(0) cv2.destroyAllWindows()
关键说明:
np.random.rand(*im.shape):生成和输入图像完全同尺寸(高×宽×通道)的随机浮点数组,每个元素值在[0,1)之间(rand_arr > 0.5):把数组转成布尔值,大于0.5的为True,否则False- 乘以255再转
uint8:把布尔值转成对应的黑白像素值(True→255,False→0),符合OpenCV的图像格式要求
方式二:保持黑白像素数量各半(和原左右分块的像素数一致)
如果你希望黑白像素的数量和原来左右分的一样多(各占总像素的50%),可以用这种方式:先创建全黑数组,再随机挑选一半的像素设为白色:
import cv2 import numpy as np im = cv2.imread('target.jpg') # 创建全黑数组 random_bw = np.zeros(im.shape, dtype=np.uint8) # 计算总像素数(把三维形状展平) total_pixels = im.shape[0] * im.shape[1] * im.shape[2] # 随机挑选一半的像素索引 white_indices = np.random.choice(total_pixels, size=int(total_pixels/2), replace=False) # 把选中的索引位置设为白色255 random_bw.flat[white_indices] = 255 cv2.imshow('Balanced Random Black & White', random_bw) cv2.waitKey(0) cv2.destroyAllWindows()
为什么之前的permutation/shuffle没用?
比如np.shuffle默认会沿数组的第一个轴(高度轴)打乱整行像素,np.permutation也是类似的轴级打乱,没法做到单个像素的随机分布。如果非要用它们,得先把图像展平成一维数组,打乱后再恢复形状,但这种方式不如上面两种直接高效。
内容的提问来源于stack exchange,提问作者vaspurakan
相关产品推荐
相关产品推荐

