Слияние изображения с коррекцией перспективы с прозрачным фоновым изображением шаблона с помощью PILLOW [PIL, Python] - PullRequest
1 голос
/ 15 апреля 2020

Проблема: у меня есть несколько изображений обложек книг. Я сделал шаблон в виде книги с трехмерной перспективой. И все, что мне теперь нужно сделать, это взять каждое из изображений обложки книги, скорректировать перспективу (она всегда постоянна, потому что шаблон всегда неизменен) и объединить мое исправленное в перспективе изображение с шаблоном (background / canvas).

Для облегчения понимания - вот пример, созданный в Adobe Photoshop: enter image description here

Красными стрелками я пытался показать точки вершин исходного изображения обложки (до коррекции перспективы). Как видите, 2 вершины справа должны остаться. Остальные две точки слева должны быть исправлены всегда одинаково.

Подскажите, пожалуйста, как этого добиться?

ОБНОВЛЕНИЕ Что у меня есть:

1) Сама обложка enter image description here

2) Шаблон с прозрачным фоном: enter image description here

Мне нужно преобразовать перспективу обложки и объединить ее с изображением шаблона

1 Ответ

4 голосов
/ 15 апреля 2020

На самом деле вам не нужно писать Python, вы можете просто сделать это в Терминале с помощью ImageMagick , используя «Перспективное преобразование» , например:

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

enter image description here

Глядя на параметры для преобразования перспективы, можно надеяться, что есть 4 пары координат, по одной паре для каждого угла преобразования, показывающего как расположение источника отображается в выходном изображении.

Итак, верхний левый угол обложки (0,0) сопоставляется с верхним левым краем пустой области в шаблоне (96,89). ). Верхний правый угол обложки (width, 0) отображается в верхнем правом углу пустой области шаблона (325,63). Нижний правый угол обложки (ширина, высота) отображается в правом нижнем углу пустой области шаблона (326,522). Нижний левый угол обложки (0, высота) отображается в левом нижнем углу пустой области шаблона (96 491).

Если вы используете старую версию 6 ImageMagick , замените magick на convert.


Обратите внимание, что если вы действительно хотите сделать это в Python, здесь есть привязка Python, называемая wand . Я не очень опытен с 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')
...