添加两个带有2D蒙版的3D numpy数组

时间:2012-10-01 01:54:31

标签: python numpy python-imaging-library

我想在灰度图像上添加两个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数组中

还是有更多的pythonic方法吗?

提前致谢!

1 个答案:

答案 0 :(得分: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]

这可能永远不会奏效。你是说'在img1Array'6_9

中将img2Array中的一些像素添加到所有像素中

如果要在两个或多个数组之间应用ufunc,它们必须是相同的形状,或者可以播放到相同的形状。