我有一個圖像作爲numpy數組和圖像蒙版。將函數應用於蒙版numpy數組
from scipy.misc import face
img = face(gray=True)
mask = img > 250
如何將函數應用於所有被屏蔽的元素?
def foo(x):
return int(x*0.5)
我有一個圖像作爲numpy數組和圖像蒙版。將函數應用於蒙版numpy數組
from scipy.misc import face
img = face(gray=True)
mask = img > 250
如何將函數應用於所有被屏蔽的元素?
def foo(x):
return int(x*0.5)
對於該特定功能,可以列出的方法很少。
方法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
,我們在兩個相等形狀的數組之間進行選擇生成與A
和B
相同形狀的新陣列。根據mask
中的元素進行選擇,該元素的形狀與A
和B
的形狀相同。因此,對於mask
中的每個True
元素,我們選擇A
,否則B
。將此翻譯成我們的情況,A
將是(img*0.5).astype(int)
和B
是img
。
方法3:有一個內置的np.putmask
這似乎是最接近這個確切的任務,可以用來做就地設置,像這樣 -
np.putmask(img, mask, (img*0.5).astype('uint8'))
謝謝你的解決方案!但我如何將它們應用於其他功能?假設,我需要生成隨機像素而不是所有蒙板單元。如果我使用這些方法,它將爲所有掩碼分配一個值 –
好吧,我明白了。起初,我生成的圖像大小與img相同,然後通過掩碼將它們合併爲一個字符串。(mask,noisy_template,img)' –
@KatrinaMalakhova我現在得到了你的問題! :)所以是的,你可以用'noisy_template = np.random.randint(0,255,img.shape).astype('uint8')'生成noisy_template。 – Divakar
其實函數返回掩碼下每個單元格的範圍內的隨機值(0,255)。 –