2014-11-08 92 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