【发布时间】:2021-06-12 05:07:55
【问题描述】:
编辑: 感谢 Mark 和 zephyr,代码现在可以运行了。 zephyr 在下面还有两个替代的工作解决方案。
我想用 PIL 划分混合两个图像。我找到了ImageChops.multiply(image1, image2),但找不到类似的divide(image, image2) 函数。
Divide Blend Mode Explained(我在这里使用前两张图片作为我的测试来源。)
是否有我错过的内置除法混合功能(PIL 或其他)?
我下面的测试代码正在运行并且越来越接近我正在寻找的内容。生成的图像输出类似于此处的分割混合示例图像:Divide Blend Mode Explained。
有没有更有效的方法来执行这种除法混合操作(步骤更少,速度更快)?起初,我尝试在 Image.eval 和 ImageMath.eval 中使用 lambda 函数来检查黑色像素并在除法过程中将它们翻转为白色,但我无法得到正确的结果。
编辑:修复代码,感谢 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')
【问题讨论】:
标签: python image-processing overlay python-imaging-library blend