编辑:代码现在工作,感谢马克和西风。 zephyr在下面还有两个备用工作解决方案。Python PIL - 分割混合两个图像的功能?
我想分割与PIL混合两个图像。我发现ImageChops.multiply(image1, image2)
但我找不到类似的divide(image, image2)
函数。
Divide Blend Mode Explained(我这里使用的前两个图像作为我的测试源。)
是否有一个内置的鸿沟混合函数,我错过了(PIL或其他)?
我的测试代码如下运行,并越来越接近我在找什么。生成的图像输出与此处的分割混合示例图像类似:Divide Blend Mode Explained。
有没有一种更有效的方式来做这种分割混合操作(更少的步骤和更快)?起初,我尝试在Image.eval
和ImageMath.eval
中使用lambda函数检查黑色像素,并在除法过程中将它们翻转为白色,但是我无法获得正确的结果。
编辑:固定代码并缩短感谢马克和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')
感谢您的解决方案。这更直接。我会看看pylab和matplotlib。我想在PIL中没有那么简单?该链接对理解其他混合模式也很有帮助。 – moski 2011-04-09 15:24:55
对不起,我对PIL不是很熟悉..我只用它来加载/保存文件。我想可能有办法做到这一点,但我发现在numpy中做数学的东西比较容易。 – so12311 2011-04-09 15:38:07
再次感谢。我已经有了numpy和scipy,所以我也会尝试你的numpy方法。 (哦,我看到我也有matplotlib。)我试图将你以前的帖子转换回我的PIL函数,但它还没有工作。同时我看到你已经更新了一些东西,所以我会再次尝试这些更改。 – moski 2011-04-09 16:22:34