python - 如何在 3d numpy 数组中选择“黑色”单元格?
问题描述
我有一个 NumPy 形状数组(512, 512, 3)
(即 RGB 图像)。该数组是从一个二进制掩码创建的,我用 Pillow 将它读入一个 3d 数组:
data = np.array(Image.open(mask).convert('RGB'))
我想将蒙版中对象的颜色更改为 RGB 颜色。为此,我需要选择数组中所有 3 个维度中值不为零的所有单元格(即(0,0,0)
= black),因为这是背景。
我尝试了以下方法 - 将非黑色单元格着色为绿色 - 没有成功:
data[data[:,:,:] > 0] = (0, 255, 0)
和
data[data[:,:,:] != (0,0,0)] = (0, 255, 0)
出现以下错误(在这两种情况下):
ValueError: NumPy boolean array indexing assignment cannot assign 3 input values to the 8679 output values where the mask is true
如何选择 3d numpy 数组中的所有“黑色”单元格?
这应该不会太难,但我无法弄清楚,而且似乎还没有关于 S/O 的类似问题(但如果我错了,请告诉我)。
这是我想要的结果:将灰色蒙版(左)转换为 RGB 颜色蒙版(右)。
解决方案
利用:
replace_arr = np.array([[[100, 255, 100]]]).repeat(512, 0).repeat(512, 1)
mask = np.repeat(np.all(arr == 0, axis = -1)[:, :, np.newaxis], 3, axis = -1)
arr = np.where(mask, 0, replace_arr)
另一种方法:
创建一个mask(True/False)
大小为 (512, 512) 的 2d,True
如果其中(i,j)
任何一个arr[i, j, :]
不等于 0 ,则为。
用于idx = np.argwhere(mask)
获取与 中的True
值相对应的索引mask
,并将这些索引设置为 中的新值arr
。
mask = np.any(arr != 0, axis = -1)
idx = np.argwhere(mask)
arr[idx[:, 0], idx[:, 1], :] = [100, 255, 100]
推荐阅读
- mongodb - Kafka 主题返回 0 条消息
- css - 我的 css 文件太大,因为 url-loader 正在将 .jpg 代码插入到 .css 文件中 - 如何配置 webpack 使其指向 img?
- c# - Tweetinvi 5.0 获取推文回复
- git - 使用 git clone 从 github 下载大型 lfs 文件时出现问题
- java - 如何在 Firestore 中构建关注系统
- c# - 未找到 Xamarin 绑定属性
- javascript - Firestore 功能云消息传递无法正常工作
- python-3.x - matplotlib 子图自动缩小
- javascript - 在节点应用程序中使用 SocketIO 跨路由/页面发送数据
- node.js - 错误 [ERR_HTTP_HEADERS_SENT]:向 API 发出请求时,无法在将标头发送到客户端后设置标头