2016-04-05 18 views
1

我有一個圖像作爲numpy數組和圖像蒙版。將函數應用於蒙版numpy數組

from scipy.misc import face 

img = face(gray=True) 
mask = img > 250 

如何將函數應用於所有被屏蔽的元素?

def foo(x): 
    return int(x*0.5) 
+0

其實函數返回掩碼下每個單元格的範圍內的隨機值(0,255)。 –

回答

1

對於該特定功能,可以列出的方法很少。

方法1:可以使用boolean indexing就地設置 -

img[mask] = (img[mask]*0.5).astype(int) 

方法2:您還可以使用np.where一個可能更直觀的解決方案 -

img_out = np.where(mask,(img*0.5).astype(int),img) 

使用具有np.where(mask,A,B)語法的np.where,我們在兩個相等形狀的數組之間進行選擇生成與AB相同形狀的新陣列。根據mask中的元素進行選擇,該元素的形狀與AB的形狀相同。因此,對於mask中的每個True元素,我們選擇A,否則B。將此翻譯成我們的情況,A將是(img*0.5).astype(int)Bimg

方法3:有一個內置的np.putmask這似乎是最接近這個確切的任務,可以用來做就地設置,像這樣 -

np.putmask(img, mask, (img*0.5).astype('uint8')) 
+0

謝謝你的解決方案!但我如何將它們應用於其他功能?假設,我需要生成隨機像素而不是所有蒙板單元。如果我使用這些方法,它將爲所有掩碼分配一個值 –

+0

好吧,我明白了。起初,我生成的圖像大小與img相同,然後通過掩碼將它們合併爲一個字符串。(mask,noisy_template,img)' –

+1

@KatrinaMalakhova我現在得到了你的問題! :)所以是的,你可以用'noisy_template = np.random.randint(0,255,img.shape).astype('uint8')'生成noisy_template。 – Divakar

相關問題