小编典典

带有蒙版和RGB图像的Numpy / Scipy

python

我正在尝试使用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 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图像?

谢谢


阅读 224

收藏
2021-01-20

共1个答案

小编典典

您可以通过2D沿最后一个轴的ALL减小获得该蒙版-

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)
2021-01-20