【问题标题】:Numpy/Scipy with masks and RGB images带有掩码和 RGB 图像的 Numpy/Scipy
【发布时间】:2017-05-29 12:42:16
【问题描述】:

我正在尝试使用skikit learn 为RGB 图像创建蒙版。我想创建一个仅选择等于 [0,10,0] 的像素的蒙版,即绿色通道上的 10。然后只显示那些像素。这应该是直截了当的,类似于http://scikit-image.org/docs/dev/user_guide/numpy_images.html,但我很挣扎。

如果图像是加载的 jpg,我可以这样做

mask = image == [0,10,0]
image = image[mask]
viewer = ImageViewer(image)
viewer.show()

但是,我得到:

TypeError: Invalid dimensions for image data

如果我然后打印(掩码),我意识到不是每个像素的一系列真假,我得到:

[[ True False  True]
  [ True False  True]
  [ True False  True]
  ..., 
  [ True False  True]
  [ True False  True]
  [ True False  True]]

请注意,我图像中的第一个像素是黑色的。所以看起来它正在做的是将 [0,0,0] 与 [0,10,0] 进行比较,而不是引发 False,而是引发 True,False,True。

这似乎作为掩码失败了,因为我想每个像素都有 3 个掩码!

有没有人知道一种简单的方法来让这种遮罩与 RGB 图像一起使用?

谢谢

【问题讨论】:

  • 你的image数组的尺寸是多少,它与(n, 3)的形状匹配吗?
  • 不,是 (276, 274, 3)
  • 你打算如何使用遮罩来展示那些特定的像素?因为遮罩后,您将不会拥有高度和宽度的 2D 格式。
  • 好点,但scikit-image.org/docs/dev/user_guide/numpy_images.html 的示例中的“相机”肯定是 x,y,并且他们成功地使用一系列 True 和 False 成功地掩盖了这一点?我不确定为什么从 x,y 更改为 x,y,3 会阻止这个过程工作......

标签: python numpy scipy python-imaging-library


【解决方案1】:

你可以得到 2D 掩码,沿最后一个轴全部减少 -

mask = (image == [0,10,0]).all(-1)

然后,image[mask] 将是仅包含 [0,10,0] 值的 (N,3) 形状数组,其中 N 是该特定 RGB 三元组的像素数。

因此,使用mask 显示蒙版图像或叠加层的步骤将取决于查看者。


对于图像中的原位编辑,这样我们就可以屏蔽掉不属于特定 RGB 三元组的所有内容,我们可以与蒙版相乘 -

image *= mask[...,None]

或者使用np.where创建一个带有选择机制的副本-

image_overlayed = np.where(mask[...,None], image, 0)

要获得3D 掩码(如果查看器需要此掩码),我们也可以沿通道复制掩码 -

np.repeat(mask[...,None],3,axis=2)

【讨论】:

  • 难道你不能同时使用image * mask[...,None] 来保留形状并允许使用ImageViewer吗?
  • 该死的你真快:P
  • @James 形状为 (276, 274) 或 (276, 274,3) 的真像素图像?
  • @James 使用:np.repeat(mask[...,None],3,axis=2)。已编辑帖子。
  • 不确定你想要那个@James。如果每行/列中“真”值的数量不同,您最终会得到一个参差不齐的数组,这会导致问题
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-06-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-21
  • 2021-05-23
  • 2019-09-29
相关资源
最近更新 更多