我有一個三維陣列(圖像)形狀(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()
我在做什麼錯?有沒有更好的方法來解決這個問題?
它看起來像'imshow',不使用面膜與RGB值蒙面陣列。一個快速的黑客可以使用RGBA值:'masked_image2 = numpy.dstack([image,(〜image_mask).astype(numpy.uint8)* 255])' – 2014-11-09 10:44:35
看起來像你以奇怪的方式創建你的面具。您將其設置爲空(這會使元素具有未知值),然後將它們的子集設置爲False。你確定你不只是想'image_mask = image_R
2014-11-10 12:23:37
@Jan Kuiken這是一個破解。這是正確的答案!謝謝。 – SeF 2018-01-11 18:49:18