编辑:由于Mark和zephyr的帮助,代码现在可以工作了。zephyr还有两种替代的工作解决方案。
我想用PIL分割混合两个图像。我找到了ImageChops.multiply(image1, image2),但找不到类似的divide(image, image2)函数。
有没有一个内置的除法混合函数,我错过了(PIL或其他)?
我下面的测试代码正在运行,并且正在接近我想要的。生成的图像输出类似于这里的divide-blend示例图像:Divide Blend Mode Explained。
有没有一种更有效的方法来进行这种分割混合操作(步骤更少,速度更快)?起初,我尝试使用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')