Numpy / Scipy带有蒙版和RGB图像

时间:2017-05-29 12:42:17

标签: python numpy scipy python-imaging-library

我尝试使用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图像进行遮罩的简单方法?

由于

1 个答案:

答案 0 :(得分:10)

你可以得到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)