使用 PILLOW [PIL, Python] 将透视校正图像与透明背景模板图像合并
Merging perspective corrected image with transparent background template image using PILLOW [PIL, Python]
问题:我有多张图书封面图片。我制作了一个类似 "book" 的模板,具有 3D 透视图。我现在要做的就是拍摄每本书的封面图像,校正透视图(它始终不变,因为模板始终不变)并将我的透视图校正图像与模板合并(background/canvas)。
为了便于理解 - 下面是在 Adobe Photoshop 中创建的示例:
我试图用红色箭头显示原始封面图像的顶点(在透视校正之前)。如您所见,右侧的 2 个顶点必须保留。左边的另外两点必须一直修正。
你能告诉我如何实现吗?
更新
我有:
1) 掩护自己
2) 透明背景模板:
我需要转换封面的透视并将其与模板图像合并
你真的不需要写任何 Python,你可以在终端中使用 ImageMagick 使用 "Perspective Transform “ 像这样:
magick cover.png -virtual-pixel none -distort perspective "0,0 96,89 %w,0 325,63 %w,%h 326,522 0,%h 96,491" template.png +swap -flatten result.png
查看透视变换的参数,您有望看到有 4 对坐标,变换的每个角各一对,显示源位置如何映射到输出图像中。
因此,封面的左上角 (0,0) 被映射到模板中空白区域的左上角 (96,89)。封面的右上角 (width,0) 被映射到模板空白区域的右上角 (325,63)。封面的右下角(宽度、高度)被映射到模板空白区域的右下角 (326,522)。封面左下角 (0,height) 映射到模板空白区域 (96,491) 的左下角。
如果您使用的是旧版 v6 ImageMagick,请将 magick
替换为 convert
。
请注意,如果您真的想在 Python 中执行此操作,则有一个名为 wand
here 的 Python 绑定。我对 wand
不是很有经验,但这似乎是等价的:
#!/usr/bin/env python3
from itertools import chain
from wand.color import Color
from wand.image import Image
with Image(filename='cover.png') as cover, Image(filename='template.png') as template:
w, h = cover.size
cover.virtual_pixel = 'transparent'
source_points = (
(0, 0),
(w, 0),
(w, h),
(0, h)
)
destination_points = (
(96, 89),
(325, 63),
(326, 522),
(96, 491)
)
order = chain.from_iterable(zip(source_points, destination_points))
arguments = list(chain.from_iterable(order))
cover.distort('perspective', arguments)
# Overlay cover onto template and save
template.composite(cover,left=0,top=0)
template.save(filename='result.png')
关键词: Python, ImageMagick, wand, image processing, perspective transform, distort.
问题:我有多张图书封面图片。我制作了一个类似 "book" 的模板,具有 3D 透视图。我现在要做的就是拍摄每本书的封面图像,校正透视图(它始终不变,因为模板始终不变)并将我的透视图校正图像与模板合并(background/canvas)。
为了便于理解 - 下面是在 Adobe Photoshop 中创建的示例:
我试图用红色箭头显示原始封面图像的顶点(在透视校正之前)。如您所见,右侧的 2 个顶点必须保留。左边的另外两点必须一直修正。
你能告诉我如何实现吗?
更新 我有:
1) 掩护自己
2) 透明背景模板:
我需要转换封面的透视并将其与模板图像合并
你真的不需要写任何 Python,你可以在终端中使用 ImageMagick 使用 "Perspective Transform “ 像这样:
magick cover.png -virtual-pixel none -distort perspective "0,0 96,89 %w,0 325,63 %w,%h 326,522 0,%h 96,491" template.png +swap -flatten result.png
查看透视变换的参数,您有望看到有 4 对坐标,变换的每个角各一对,显示源位置如何映射到输出图像中。
因此,封面的左上角 (0,0) 被映射到模板中空白区域的左上角 (96,89)。封面的右上角 (width,0) 被映射到模板空白区域的右上角 (325,63)。封面的右下角(宽度、高度)被映射到模板空白区域的右下角 (326,522)。封面左下角 (0,height) 映射到模板空白区域 (96,491) 的左下角。
如果您使用的是旧版 v6 ImageMagick,请将 magick
替换为 convert
。
请注意,如果您真的想在 Python 中执行此操作,则有一个名为 wand
here 的 Python 绑定。我对 wand
不是很有经验,但这似乎是等价的:
#!/usr/bin/env python3
from itertools import chain
from wand.color import Color
from wand.image import Image
with Image(filename='cover.png') as cover, Image(filename='template.png') as template:
w, h = cover.size
cover.virtual_pixel = 'transparent'
source_points = (
(0, 0),
(w, 0),
(w, h),
(0, h)
)
destination_points = (
(96, 89),
(325, 63),
(326, 522),
(96, 491)
)
order = chain.from_iterable(zip(source_points, destination_points))
arguments = list(chain.from_iterable(order))
cover.distort('perspective', arguments)
# Overlay cover onto template and save
template.composite(cover,left=0,top=0)
template.save(filename='result.png')
关键词: Python, ImageMagick, wand, image processing, perspective transform, distort.