2014-11-08 93 views
3

我有一个三维阵列(图像)形状(480, 640, 3)。这里,3代表BGR颜色代码。我想使用红色图像数组中的数据在此图像上放置遮罩。根据其值,某些像素需要被屏蔽。使用2D掩模掩蔽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() 

我在做什么错?有没有更好的方法来解决这个问题?

+1

它看起来像'imshow',不使用面膜与RGB值蒙面阵列。一个快速的黑客可以使用RGBA值:'masked_image2 = numpy.dstack([image,(〜image_mask).astype(numpy.uint8)* 255])' – 2014-11-09 10:44:35

+2

看起来像你以奇怪的方式创建你的面具。您将其设置为空(这会使元素具有未知值),然后将它们的子集设置为False。你确定你不只是想'image_mask = image_R 2014-11-10 12:23:37

+0

@Jan Kuiken这是一个破解。这是正确的答案!谢谢。 – SeF 2018-01-11 18:49:18

回答

1

尝试使用与image相同形状的面具(实际上,这将是3D面具)。生成您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的蒙面阵列暂时。

+0

如果答案适合您的需求,请将其标记为已解决。谢谢! – jkalden 2014-12-03 14:39:38

0

也许这另一种方法是在类似的情况下,更容易:

image[image_mask,:] = np.nan