Python PIL - 分割混合两个图像的函数?
编辑:代码现在可以运行,感谢 Mark 和 zephyr。 zephyr 还有以下两种替代工作解决方案。
我想用 PIL 来划分混合两个图像。我找到了 ImageChops.multiply(image1, image2) ,但找不到类似的 divide(image, image2) 函数。
分割混合模式解释(我在这里使用前两张图像作为我的测试源。)
是否有我错过的内置除法混合函数(PIL 或其他)?
我下面的测试代码运行并且接近我正在寻找的内容。生成的图像输出类似于此处的除法混合示例图像: 划分混合模式说明。
是否有更有效的方法来执行除法混合操作(步骤更少且速度更快)?起初,我尝试在 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')
EDIT: Code is working now, thanks to Mark and zephyr. zephyr also has two alternate working solutions below.
I want to divide blend two images with PIL. I found ImageChops.multiply(image1, image2)
but I couldn't find a similar divide(image, image2)
function.
Divide Blend Mode Explained (I used the first two images here as my test sources.)
Is there a built-in divide blend function that I missed (PIL or otherwise)?
My test code below runs and is getting close to what I'm looking for. The resulting image output is similar to the divide blend example image here: Divide Blend Mode Explained.
Is there a more efficient way to do this divide blend operation (less steps and faster)? At first, I tried using lambda functions in Image.eval
and ImageMath.eval
to check for black pixels and flip them to white during the division process, but I couldn't get either to produce the correct result.
EDIT: Fixed code and shortened thanks to Mark and zephyr. The resulting image output matches the output from zephyr's numpy and scipy solutions below.
# 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')
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
你问的是:
您还可以使用 python 包混合模式。它是用矢量化 Numpy 数学编写的,通常速度很快。通过
pip install Blend_modes
安装它。我以更详细的方式编写了命令以提高可读性,链接它们会更短。像这样使用blend_modes
来划分图像:请注意,要实现此功能,两个图像需要具有相同的尺寸,例如
imgA.shape == (240,320,3)
和imgB.shape == (240,320,3)
。You are asking:
You could also use the python package blend modes. It is written with vectorized Numpy math and generally fast. Install it via
pip install blend_modes
. I have written the commands in a more verbose way to improve readability, it would be shorter to chain them. Useblend_modes
like this to divide your images:Be aware that for this to work, both images need to have the same dimensions, e.g.
imgA.shape == (240,320,3)
andimgB.shape == (240,320,3)
.除法函数有一个数学定义:
http://www.linuxtopia.org/online_books/graphics_tools/gimp_advanced_guide/gimp_guide_node55_002.html
这是使用 scipy/matplotlib 的实现:
如果你不想使用 matplotlib,你可以这样做(我假设你有 numpy):
There is a mathematical definition for the divide function here:
http://www.linuxtopia.org/online_books/graphics_tools/gimp_advanced_guide/gimp_guide_node55_002.html
Here's an implementation with scipy/matplotlib:
If you don't want to use matplotlib, you can do it like this (I assume you have numpy):
您遇到的问题是当图像 B 中有零时 - 它会导致除以零。如果您将所有这些值转换为 1,我认为您会得到所需的结果。这将消除检查零并将其修复在结果中的需要。
The problem you're having is when you have a zero in image B - it causes a divide by zero. If you convert all of those values to one instead I think you'll get the desired result. That will eliminate the need to check for zeros and fix them in the result.