将函数应用于遮罩的NumPy数组

3
我有一张numpy数组表示的图像和一个与此图像相对应的掩码。
from scipy.misc import face

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

如何将函数应用于所有被遮罩的元素?
def foo(x):
    return int(x*0.5) 

实际上,函数应该为掩码下的每个单元格返回范围(0,255)内的随机值。 - Katerina
1个回答

4

针对该特定函数,可以列出几种方法。

方法1:您可以使用 布尔索引 进行原地设置 -

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

方法二:您也可以使用 np.where 来获得更直观的解决方案 -

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

使用具有语法np.where(mask,A,B)np.where,我们在两个形状相同的数组AB之间进行选择,以生成与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'))

谢谢你的解决方案!但是我该如何将它们应用到其他函数?假设我需要随机生成像素而不是所有掩码单元格。如果我使用这些方法,它会将一个值分配给所有掩码单元格。 - Katerina
好的,我明白了。首先,我会生成与“img”大小相同的嘈杂图像,然后通过掩码将它们合并在一起,“ans = np.where(mask, noisy_template, img)”。 - Katerina
1
@KatrinaMalakhova 啊,我现在明白你的问题了! :) 所以是的,你可以使用noisy_template = np.random.randint(0,255,img.shape).astype('uint8')生成带有噪声的模板。 - Divakar

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接