我正在尝试使用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图像?
谢谢
您可以通过2D沿最后一个轴的ALL减小获得该蒙版-
2D
mask = (image == [0,10,0]).all(-1)
然后,image[mask]将(N,3)形成仅[0,10,0]值的形状数组,其中N是该特定RGB三元组的像素数。
image[mask]
(N,3)
[0,10,0]
N
因此,mask用于显示遮罩的图像或覆盖图的步骤将取决于查看者。
mask
对于图像的原位编辑,以便我们可以遮盖所有不属于该特定RGB三联体的所有内容,我们可以与遮罩相乘-
image *= mask[...,None]
或使用np.where-选择机制创建副本
np.where
image_overlayed = np.where(mask[...,None], image, 0)
要获得3D遮罩(如果查看器需要的话),我们也可以沿通道复制遮罩-
3D
np.repeat(mask[...,None],3,axis=2)