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数组中

还是有更蟒蛇的方式来做到这一点?

提前致谢!

4

1 回答 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,它们必须是相同的形状,或者可以广播到相同的形状。

于 2012-10-01T02:31:57.627 回答