使用2D掩码将两个3D numpy数组相加

3

我希望将两个3D numpy数组(RGB图像数组)与由某些算法在灰度图像上生成的2D掩码相加。最好的方法是什么?

以下是我尝试做的示例:

from PIL import Image, ImageChops, ImageOps
import numpy as np

img1=Image.open('./foo.jpg')
img2=Image.open('./bar.jpg')

img1Grey=ImageOps.grayscale(img1)
img2Grey=ImageOps.grayscale(img2)

# Some processing for example:
diff=ImageChops.difference(img1Grey,img2Grey)
mask=np.ma.masked_array(img1,diff>1)

img1Array=np.asarray(im1)
img2Array=np.asarray(im2)

imgResult=img1Array+img2Array[mask]

我在思考:
1) 将RGB图像分解并分别处理每种颜色
2) 将掩模复制到3D数组中

是否有更符合Python习惯的方法可以实现上述功能?

提前致谢!

1个回答

4

希望我能添加评论而不是答案。无论如何:

masked_array并不用于创建掩码,它只包含在科学统计应用程序中的计算(例如求和、平均值等)之外的数据。它由一个数组和该数组的掩码组成。 这可能不是您想要的。

您可能只需要一个普通的布尔掩码,如下所示:

mask = diff>1

然后你需要修改形状,使numpy在正确的维度上进行广播,然后将其广播到第三个维度:

mask.shape = mask.shape + (1,)
mask = np.broadcast_arrays(img1Array, mask)[1]

之后,您只需添加像素即可:
img1Array[mask] += img2Array[mask]

进一步澄清一点:
imgResult=img1Array+img2Array[mask]

这种方法行不通。你是在说将img2Array中的一些像素加入到img1Array的所有像素中 6_9

如果你想在两个或多个数组之间应用ufunc,则它们必须具有相同的形状,或者可以广播到相同的形状。


谢谢你的回答!难怪我找不到答案,原来我走错了方向。看起来已经解决了我的问题,但我还需要清理和确认一下。 - Onlyjus
谢谢您提到broadcast_arrays。直到现在我才知道这是一件事。 - Mad Physicist

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