2012-10-01 51 views
3

我想添加兩個3D numpy陣列(RGB圖像陣列)和一些灰度圖像上的某些算法生成的2D掩膜。做這個的最好方式是什麼?用2D掩膜添加兩個3D numpy陣列

至於是什麼,我試圖做一個例子:

from PIL import Image, ImageChops, ImageOps 
import numpy as np 

img1=Image.open('./foo.jpg') 
img2=Image.open('./bar.jpg') 

img1Grey=ImageOps.grayscale(img1) 
img2Grey=ImageOps.grayscale(img2) 

# Some processing for example: 
diff=ImageChops.difference(img1Grey,img2Grey) 
mask=np.ma.masked_array(img1,diff>1) 

img1Array=np.asarray(im1) 
img2Array=np.asarray(im2) 

imgResult=img1Array+img2Array[mask] 

我在想:
1)分手的RGB圖像,然後每個顏色單獨
2)複製面具成3D array

還是有更pythonic的方式來做到這一點?

在此先感謝!

回答

4

希望我可以添加評論而不是答案。總之:

masked_array是不是製作面具。這是爲了在計算中僅包含面外數據,如總和,平均值等。科學統計應用程序。它由一個數組和數組的掩碼組成。 這可能不是你想要的。

你可能只是想要一個正常的布爾面具,如:

mask = diff>1 

然後,你將需要修改的形狀,因此numpy的廣播在正確的尺寸,然後廣播它到第三維:

mask.shape = mask.shape + (1,) 
mask = np.broadcast_arrays(img1Array, mask)[1] 

之後,你可以添加像素:

img1Array[mask] += img2Array[mask] 

進一步澄清點:

imgResult=img1Array+img2Array[mask] 

這可能永遠不會工作。你說的「一些從img2Array像素添加到中的像素的所有 img1Array」 6_9

如果你想在兩個或多個陣列之間施加ufunc,他們必須是相同的形狀,或broadcastable到相同的形狀。

+0

感謝您的回答!難怪爲什麼我找不到答案,我走錯了方向。它似乎解決了我的問題。我必須清理並確保。 – Onlyjus

+0

感謝您提及'broadcast_arrays'。直到現在我才知道這是一件事。 –