我想添加两个 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 的方式来做到这一点?
提前致谢!
希望我可以添加评论而不是答案。无论如何:
masked_array 不是用于制作面具。它用于在诸如求和、均值等计算中仅包含掩码之外的数据。科学统计应用程序。它由一个数组和数组的掩码组成。这可能不是您想要的。
您可能只需要一个普通的 bool 掩码,如:
mask = diff>1
然后您需要修改形状,以便 numpy 在正确的维度中广播,然后将其广播到第 3 维:
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,它们必须是相同的形状,或者可广播到相同的形状。
我是一名优秀的程序员,十分优秀!