【发布时间】:2025-12-05 08:25:01
【问题描述】:
我有一个形状为(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()
我做错了什么?有没有更好的方法来解决这个问题?
【问题讨论】:
-
它看起来像
imshow,不使用掩码用于具有 RGB 值的掩码数组。快速破解可以使用 RGBA 值:masked_image2 = numpy.dstack([image, (~image_mask).astype(numpy.uint8)*255]) -
在我看来,你制作面具的方式很奇怪。您将其设置为空(这使得元素采用未知值),然后将它们的子集设置为 False。你确定你不只是想要
image_mask = image_R < pixel_value? -
@Jan Kuiken 这是一个黑客。这是正确的答案!谢谢。
标签: python image numpy matplotlib mask