多次numpy场所通话产生奇怪的结果

时间:2019-05-03 21:03:47

标签: python numpy

我正在尝试创建用于某些图像操作的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

enter image description here

mask

enter image description here

我希望弯角部位是白色的,但事实并非如此。它是紫红色(112, 112, 112)的灰度版本

我对numpy相当陌生,因此我什至可能吠错了树,并且可能有更简单的方法来做到这一点。我究竟做错了什么?有没有更简单的方法来执行我正在描述的事情?谢谢!

1 个答案:

答案 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用于此类事情,但我从不对付这些问题。