python - 多个 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 还很陌生,所以我什至可能会叫错树,并且可能有更简单的方法来做到这一点。我究竟做错了什么?有没有更简单的方法来做我所描述的事情?谢谢!
解决方案
似乎您可以使用布尔数组作为掩码。例如:
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]
顺便说一句,我认为您“应该”将蒙面数组用于此类事情,但我从未掌握过这些。
推荐阅读
- typescript - 有任何理由在 TypeORM 事务中使用 Promise.all 吗?
- python - 如何合并多个不同长度的数据帧
- python - Pyinstaller 停止在“信息:构建 PKG(CArchive)PKG-00.pkg”中
- excel - 如何根据 ComboBox 文本插入图像?
- mysql - 在mysql中将逗号分隔值拆分为多行
- c# - 在 C# 中使用 WireMock 模拟 TCP 响应
- firebase - 如何在firebase托管中使用声明的公用文件夹重写基本url?
- java - 当我将十进制数字输入到 double 类型的变量时,我得到一个 InputMismatchException
- locust - 当我有多个用户类别时如何控制用户分布?
- javascript - forEach 在香草 JS 中更改颜色文本