我有一个图像作为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)。 –