使用数组的块状滤波

编程入门 行业动态 更新时间:2024-10-25 02:30:31
本文介绍了使用数组的块状滤波的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧! 问题描述

我知道以前有人问过这个问题,但似乎没有针对我的特定用例的任何内容。

我有一个数字数组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)添加丢失的维度,这不太优雅。

更多推荐

使用数组的块状滤波

本文发布于:2023-11-08 15:47:38,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1569794.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:块状   数组

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!