使用2D掩膜对BGR图像进行遮蔽

8
我有一个三维数组(图像),形状为(480,640,3)。这里的3是指BGR颜色代码。我想使用来自红色图像数组的数据在图像上放置一个蒙版。根据其值,需要屏蔽某些像素。
创建蒙版很好用,表现出的结果也与预期一致。为了将蒙版应用于原始图像,我首先将蒙版应用于蓝色和绿色图像。一切仍然正常。现在我堆叠三个遮罩数组,返回一个形状为(480, 640, 3)的数组。但是,使用imshow绘制此数组会导致原始图像。没有任何掩码迹象。
以下是我的代码。该代码适用于任何图像大小/形状。您只需要更改名称"Whatever_image_you_like.png"以更改为计算机中任何图像的名称。
import numpy
import numpy.ma
import scipy.misc
import matplotlib.pyplot as plt

pixel_value = 130   #Value in range 0 to 255

image = scipy.misc.imread("Whatever_image_you_like.png")

#Extract Blue, Green, and Red image from original image
image_B = numpy.copy(image[:, :, 0])
image_G = numpy.copy(image[:, :, 1])
image_R = numpy.copy(image[:, :, 2])

#Define mask depending on pixel value in Red image
image_mask = numpy.empty([image.shape[0], image.shape[1]], dtype = bool)
image_mask[image_R < pixel_value] = False

#Apply mask to Blue, Green, and Red images
B_masked = numpy.ma.masked_array(image_B, mask = ~image_mask)
G_masked = numpy.ma.masked_array(image_G, mask = ~image_mask)
R_masked = numpy.ma.masked_array(image_R, mask = ~image_mask)

#Stack masked images together again
masked_image = numpy.ma.dstack((B_masked, G_masked, R_masked))

#Plot original image and masked version
fig = plt.figure()

ax1 = fig.add_subplot(2, 1, 1)
ax1.imshow(image)

ax2 = fig.add_subplot(2, 1, 2)
ax2.imshow(masked_image)

plt.show()

我做错了什么?有更好的方法来解决这个问题吗?该怎么做?

2
看起来像是 imshow,但对于带有 RGB 值的掩膜数组不使用掩膜。一个快速的解决方法是使用 RGBA 值:masked_image2 = numpy.dstack([image, (~image_mask).astype(numpy.uint8)*255]) - Jan Kuiken
4
在我看来,你用了一种奇怪的方式创建了你的掩膜。你将其设置为空(这使得元素取一个未知的值),然后将其中的一个子集设置为False。你确定你不只是想要image_mask = image_R < pixel_value吗? - Hannes Ovrén
@Jan Kuiken 这是一个黑客行为。这才是正确的答案!谢谢。 - SeF
2个回答

5

尝试使用与image相同形状的掩膜(实际上,这将是一个三维掩膜)。生成您的image_mask后,执行以下操作:

# create mask with same dimensions as image
mask = numpy.zeros_like(image)

# copy your image_mask to all dimensions (i.e. colors) of your image
for i in range(3): 
    mask[:,:,i] = image_mask.copy()

# apply the mask to your image
masked_image = image[mask]

目前我避免在numpy中使用掩码数组。


如果答案符合您的需求,请将其标记为已解决。谢谢! - jkalden

1
也许在类似的情况下,这种替代方法会更容易:
image[image_mask,:] = np.nan

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