我想在灰度图像上添加两个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方法吗?
提前致谢!
答案 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,它们必须是相同的形状,或者可以播放到相同的形状。