编辑:代码现在可以运行,感谢Mark和zephyr,zephyr还提供了两个可行的备选解决方案。
我想使用PIL来分割混合两张图片。我找到了ImageChops.multiply(image1, image2)
,但我找不到类似的divide(image, image2)
函数。
解释混合模式(我将这里的前两张图像用作我的测试源)。
是否有我错过的内置分割混合函数(PIL或其他)?
我的测试代码如下,它可以运行并且接近我要寻找的目标。生成的图像输出与此处的分割混合示例图像相似:解释混合模式。
是否有更有效的方法进行这种分割混合操作(步骤更少、速度更快)?起初,我尝试使用lambda函数在Image.eval
和ImageMath.eval
中检查黑色像素并在除法过程中将其翻转为白色,但我无法使它们产生正确的结果。
编辑:修正了代码并缩短了长度,感谢Mark和zephyr。生成的图像输出与zephyr的numpy和scipy解决方案的输出相匹配。
# PIL Divide Blend test
import Image, os, ImageMath
imgA = Image.open('01background.jpg')
imgA.load()
imgB = Image.open('02testgray.jpg')
imgB.load()
# split RGB images into 3 channels
rA, gA, bA = imgA.split()
rB, gB, bB = imgB.split()
# divide each channel (image1/image2)
rTmp = ImageMath.eval("int(a/((float(b)+1)/256))", a=rA, b=rB).convert('L')
gTmp = ImageMath.eval("int(a/((float(b)+1)/256))", a=gA, b=gB).convert('L')
bTmp = ImageMath.eval("int(a/((float(b)+1)/256))", a=bA, b=bB).convert('L')
# merge channels into RGB image
imgOut = Image.merge("RGB", (rTmp, gTmp, bTmp))
imgOut.save('PILdiv0.png', 'PNG')
os.system('start PILdiv0.png')
d=
行是怎么回事,但我猜它的工作方式类似于 GIMP 指南方程式中的 min(255,c)。我无法将其压缩到我的ImageMath.eval
中,但输出仍与你的相匹配。ImageMath.eval
可能已经内置了 255 的剪裁。 - moski