使用2D遮罩遮罩BGR图像 [英] Masking BGR image using a 2D mask

查看:72
本文介绍了使用2D遮罩遮罩BGR图像的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个形状为(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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆