编辑:多亏了Mark和zephyr,代码现在可以工作了。zephyr也有以下两种替代工作解决方案
我想用PIL分割并混合两个图像。我找到了ImageChops.multiply(image1, image2)
,但找不到类似的divide(image, image2)
函数
Divide Blend Mode Explained(我在这里使用前两个图像作为测试源。)
是否有我错过的内置divide blend函数(PIL或其他)
我下面的测试代码正在运行,并且正在接近我想要的。结果图像输出类似于此处的divide blend示例图像:Divide Blend Mode Explained
是否有一种更有效的方法来执行此分割混合操作(步骤更少,速度更快)?起初,我尝试在Image.eval
和ImageMath.eval
中使用lambda函数来检查黑色像素,并在除法过程中将它们翻转为白色,但我无法得到两者中的任何一个来产生正确的结果
编辑:修复了代码,由于马克和西风,代码缩短了。生成的图像输出与下面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')
你遇到的问题是,当你在图像B中有一个零时,它会导致一个被零除的结果。如果你把所有这些值都转换成一,我想你会得到想要的结果。这将消除检查零并在结果中修复它们的需要
你在问:
您还可以使用python包blend modes。它是用矢量化Numpy数学编写的,通常速度很快。通过
pip install blend_modes
安装它。我已经用更详细的方式编写了这些命令,以提高可读性,因此链接它们会更短。像这样使用blend_modes
分割图像:请注意,要使其工作,两个图像需要具有相同的维度,例如
imgA.shape == (240,320,3)
和imgB.shape == (240,320,3)
这里有一个除法函数的数学定义: http://www.linuxtopia.org/online_books/graphics_tools/gimp_advanced_guide/gimp_guide_node55_002.html
下面是一个使用scipy/matplotlib的实现:
如果不想使用matplotlib,可以这样做(我假设您有numpy):
相关问题 更多 >
编程相关推荐