使用2D遮罩遮罩BGR图像 [英] Masking BGR image using a 2D mask
问题描述
我有一个形状为(480, 640, 3)
的三维阵列(图像).在此,3表示BGR
颜色代码.我想使用红色图像数组中的数据在此图像上放置一个蒙版.根据其值,某些像素需要被遮罩.
I have a three-dimensional array (image) with shape (480, 640, 3)
. Here, the 3 refers to BGR
color code. I would like to place a mask over this image using the data from the array of the Red image. Depending on its value, certain pixels need to be masked.
创建遮罩效果很好.它的行为完全符合预期.为了将蒙版应用于原始图像,我首先将蒙版应用于蓝色和绿色图像.一切还好.现在,我将三个蒙版数组堆叠在一起,这将返回形状为(480, 640, 3)
的数组.但是,使用imshow
绘制此数组会得到原始图像.没有任何面具的迹象.
Creating the mask works fine. It behaves exactly as expected. In order to apply the mask to the original image, I first apply the mask to the Blue and Green image. All is still fine. Now I stack the three masked arrays, which returns an array with shape (480, 640, 3)
. However, plotting this array using imshow
results in the original image. No sign of any mask.
下面我放我的代码.该代码适用于任何图像尺寸/形状.您需要做的就是将名称"Whatever_image_you_like.png"
更改为PC上任何图像的名称.
Below I put my code. The code works for any image size/shape. All you need to do is change the name "Whatever_image_you_like.png"
to the name of any image on your pc.
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()
我做错了什么?有没有更好的方法来解决此问题?
What am I doing wrong? Is there a better way to approach this problem?
推荐答案
尝试使用形状与image
相同的蒙版(实际上,这将是3D蒙版).生成image_mask
后,执行
Try to use a mask with the same shape as the image
(actually, this will be a 3D mask). After generating your image_mask
, do
# 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中使用掩码数组.
This way I avoid masked arrays in numpy for the time being.
这篇关于使用2D遮罩遮罩BGR图像的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!