Numpy/Scipy与掩码和RGB图像

5
我正在尝试使用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

如果我打印(mask),我发现我得到的不是每个像素的一系列True和False,而是:
[[ 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) 的形状相匹配? - Christoph Engwer
不是,它是(276,274,3)。 - James
你打算如何使用面具来显示那些特定的像素?因为在遮罩之后,你不会拥有高度和宽度的2D格式。 - Divakar
好的观点,但是在http://scikit-image.org/docs/dev/user_guide/numpy_images.html的示例中,“camera”肯定是x,y,并且他们成功地使用一系列True和False进行了掩蔽。我不确定为什么从x,y更改为x,y,3会阻止这个过程继续工作... - James
1个回答

17

你可以获得沿着最后一个轴进行全部缩减的2D掩码 -

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

那么,image[mask] 将成为一个形状为 (N,3) 的数组,其中只有值为 [0,10,0] 的像素点,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 吗? - Daniel F
你真快 :P - Daniel F
@James 真实像素图形的形状是 (276, 274) 还是 (276, 274,3)? - Divakar
你也可以使用mask = (image == [0,10,0]).all(-1, keepdims = True)进行操作。 - Daniel F
1
不确定你是否需要那个,@James。如果每行/列中“true”值的数量不同,你最终会得到一个不规则的数组,这将导致问题。 - Daniel F
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接