2016-04-05 19 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

相关问题