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