我正在尝试创建用于某些图像操作的8位1通道蒙版。我有一张图像,其中某些像素在255, 0, 255
图像中充满了紫红色(original
),这表示应在遮罩中使用该像素。
我的想法是简单地复制原始图片,然后用白色替换所有的fuscia像素,并用黑色替换所有的非fuscia像素。我正在使用numpy.place
来做到这一点。但是,似乎只真正“应用”了最后一个place
操作。
例如,在下面的代码中,我尝试首先将所有的融合像素都设置为白色,然后将所有非融合像素都设置为黑色。但是,当我去实际保存图像并查看时,只有非融合像素已变黑。
mask = original.copy()
np.place(mask, mask == (255, 0, 255), (255, 255, 255))
np.place(mask, mask != (255, 0, 255), (0, 0, 0))
mask = mask.reshape((h, w, 3))
mask = cv2.cvtColor(mask, cv2.COLOR_RGB2GRAY)
original
mask
我希望弯角部位是白色的,但事实并非如此。它是紫红色(112, 112, 112
)的灰度版本
我对numpy相当陌生,因此我什至可能吠错了树,并且可能有更简单的方法来做到这一点。我究竟做错了什么?有没有更简单的方法来执行我正在描述的事情?谢谢!
答案 0 :(得分:1)
似乎您可以使用布尔数组作为掩码。例如:
mask = np.any(original==[255, 0, 255], axis=-1)
现在,您可以执行original[mask]
来获取洋红色像素,或者执行orignal[~mask]
来获取其他像素。
您会发现您无法覆盖original
,但可以覆盖副本:
newimg = original.copy()
newimg[mask] = [255, 255, 255]
newimg[~mask] = [0, 0, 0]
顺便说一句,我认为您应该将masked arrays用于此类事情,但我从不对付这些问题。