首页 > 解决方案 > 多个 numpy 地方调用产生奇怪的结果

问题描述

我正在尝试创建一个用于某些图像操作的 8 位 1 通道掩码。我有一张图像,其中某些像素用 fuscia ( 255, 0, 255)填充,original这表明该像素应用于掩蔽。

我的想法是简单地复制原始图片,然后将所有 fuscia 像素替换为白色,将所有非 fuscia 像素替换为黑色。我numpy.place用来做这个。然而,似乎只真正“应用”了最后一个place操作。

例如,在下面的代码中,我尝试首先将所有 fuscia 像素设置为白色,然后将所有非 fuscia 像素设置为黑色。然而,当我去实际保存图像并查看它时,只有非红褐色像素已变成黑色。

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

在此处输入图像描述

我希望fuscia区域是白色的,但事实并非如此。它是 fuscia 颜色 ( 112, 112, 112)的灰度版本

我对 numpy 还很陌生,所以我什至可能会叫错树,并且可能有更简单的方法来做到这一点。我究竟做错了什么?有没有更简单的方法来做我所描述的事情?谢谢!

标签: pythonnumpy

解决方案


似乎您可以使用布尔数组作为掩码。例如:

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]

顺便说一句,我认为您“应该”将蒙面数组用于此类事情,但我从未掌握过这些。


推荐阅读