2017-05-29 37 views
0

我試圖創建一個使用skikit學習RGB圖像的面具。我想創建一個遮罩,只選擇等於[0,10,0]的像素,即綠色通道上的10。然後只顯示那些像素。這應該是直截了當的,類似於http://scikit-image.org/docs/dev/user_guide/numpy_images.html,但我很掙扎。Numpy/Scipy與面具和RGB圖像

如果圖像是加載JPG,我可以做

mask = image == [0,10,0] 
image = image[mask] 
viewer = ImageViewer(image) 
viewer.show() 

不過,我得到:

TypeError: Invalid dimensions for image data 

如果我再打印(屏蔽),我才知道的,而不是一系列真實的和虛假的每個像素,我得到:

[[ True False True] 
    [ True False True] 
    [ True False True] 
    ..., 
    [ True False True] 
    [ True False True] 
    [ True False True]] 

請注意,我的圖像中的第1個像素是黑色的。所以看起來它將[0,0,0]與[0,10,0]進行比較,而不是提高False,而是提高True,False,True。

然後,這看起來失敗了,因爲我對每個像素都有3個蒙版,我想!

有誰知道一個簡單的方法來獲得這種掩膜與RGB圖像工作?

感謝

+0

你的'image'數組的維數是否與(n,3)的形狀相匹配? –

+0

不是(276,274,3) – James

+0

你打算如何使用蒙版來顯示這些特定像素的顯示?因爲遮罩之後,您將不會擁有高度和寬度的2D格式。 – Divakar

回答

3

你可以拿到2D面具沿最後軸的所有還原 -

mask = (image == [0,10,0]).all(-1) 

然後,image[mask]將只有[0,10,0](N,3)形排列,其中N是像素數,其是特定的RGB三元組。

因此,使用mask來顯示屏蔽的圖像或覆蓋圖的步驟取決於觀察者。


對於就地編輯的圖像,這樣我們會屏蔽掉一切的特定RGB三元的時候,我們可以用面具乘 -

image *= mask[...,None] 

或者創建一個副本使用np.where一個選擇機制 -

image_overlayed = np.where(mask[...,None], image, 0) 

要獲得3D掩碼(如果這就是需要用瀏覽器),我們可以複製沿通道面具以及 -

np.repeat(mask[...,None],3,axis=2) 
+0

難道你不可以'image * mask [...,None]來保存形狀並允許使用ImageViewer? –

+0

該死的你快:P –

+0

@DanielF在那裏讀你的心靈;) – Divakar