Numpy filtering using array(使用数组的块状滤波)
问题描述
我知道以前有人问过这个问题,但似乎没有针对我的特定用例的任何内容。
我有一个数字数组obs
,它表示彩色图像,形状为(252, 288, 3)
。
我要将每个不是纯黑色的像素转换为纯白色。
我尝试的是obs[obs != [0, 0, 0]] = [255, 255, 255]
,但出现以下异常:
ValueError: NumPy boolean array indexing assignment cannot assign 3 input values to the 807 output values where the mask is true
结果与obs[obs[:, :] != [0, 0, 0]] = [255, 255, 255]
相同。另外,(obs[:, :] != [0, 0, 0]).shape
是(252, 288, 3)
,我不明白为什么它不是简单的(252, 288)
(布尔矩阵)。
我考虑过使用obs[obs != 0] = 255
,但那不会有我想要的效果,因为纯绿色([0, 255, 0]
)的像素将按组件进行处理,过滤后仍为[0, 255, 0]
,而不是实际为白色([255, 255, 255]
)。
我到现在为止尝试的东西为什么不起作用,我应该如何着手?
推荐答案
布尔索引(如obs[obs != [0, 0, 0]]
)返回一个一维数组,其中包含obs
中满足给定条件的所有元素。
请看下面的示例:
obs = np.array([
[[88, 0,99],
[ 0, 0, 0]],
[[ 0, 0, 0],
[88,77,66]]
])
obs != [0, 0, 0]
返回布尔数组:
array([[[ True, False, True],
[False, False, False]],
[[False, False, False],
[ True, True, True]]])
ANDobs[obs != [0, 0, 0]]
然后返回包含掩码为True
:array([88, 99, 88, 77, 66])
的所有元素的一维数组。
所以您需要where
测试是否有any
颜色分量不等于0:
np.where(obs.any(axis=-1, keepdims=True), 255, obs)
结果:
array([[[255, 255, 255],
[ 0, 0, 0]],
[[ 0, 0, 0],
[255, 255, 255]]])
请注意,您需要keepdims=True
才能启用广播到obs
的原始形状。否则,您将不得不通过np.where(obs.any(-1)[...,np.newaxis], 255, obs)
或np.where(np.atleast_3d(obs.any(-1)), 255, obs)
添加丢失的维度,这不太优雅。
这篇关于使用数组的块状滤波的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
本文标题为:使用数组的块状滤波
基础教程推荐
- 合并具有多索引的两个数据帧 2022-01-01
- 症状类型错误:无法确定关系的真值 2022-01-01
- 如何在Python中绘制多元函数? 2022-01-01
- 将 YAML 文件转换为 python dict 2022-01-01
- 如何在 Python 中检测文件是否为二进制(非文本)文 2022-01-01
- 使用Python匹配Stata加权xtil命令的确定方法? 2022-01-01
- Python 的 List 是如何实现的? 2022-01-01
- 使 Python 脚本在 Windows 上运行而不指定“.py";延期 2022-01-01
- 使用 Google App Engine (Python) 将文件上传到 Google Cloud Storage 2022-01-01
- 哪些 Python 包提供独立的事件系统? 2022-01-01