Вставьте картинку в рамку - PullRequest
       43

Вставьте картинку в рамку

0 голосов
/ 25 октября 2019

У меня красивая рамка и изображение, которое нужно вставить в этот кадр.

Frame

Этот кадр

image

Это изображение

Код Python

frame = Image.open("pathToFirstImage")
image = Image.open("pathToSecondImage")

frame.paste(image, (0,0))
frame.show()
frame.save("output image path")

Как вставить изображение, обрамленное красным контуром.

Углы контура известны. (Я смотрел в фотошопе)

1 Ответ

1 голос
/ 25 октября 2019

Я скептически отношусь к тому, что эту задачу можно решить, используя только PIL / Pillow, по крайней мере, если вы хотите автоматически найти красную рамку и т. Д.

Так что, если вы используете OpenCV, это вариант,Я бы предложил следующее решение с использованием некоторого цветового порога и cv2.findContours. Этот подход также должен быть перенесен на лыжный образ, например.

import cv2
import numpy as np
from skimage import io      # Only needed for web grabbing images; use cv2.imread(...) for local images

# Read images
frame = cv2.cvtColor(io.imread('https://i.stack.imgur.com/gVf0a.png'), cv2.COLOR_RGB2BGR)
image = cv2.cvtColor(io.imread('https://i.stack.imgur.com/Vw5Rc.jpg'), cv2.COLOR_RGB2BGR)

# Color threshold red frame; single color here, more sophisticated solution would be using cv2.inRange
mask = 255 * np.uint8(np.all(frame == [36, 28, 237], axis=2))

# Find inner contour of frame; get coordinates
contours, _ = cv2.findContours(mask, cv2.RETR_LIST, cv2.CHAIN_APPROX_SIMPLE)
cnt = min(contours, key=cv2.contourArea)
(x, y, w, h) = cv2.boundingRect(cnt)

# Copy appropriately resized image to frame
frame[y:y+h, x:x+w] = cv2.resize(image, (w, h))

cv2.imshow('frame', frame)
cv2.waitKey(0)
cv2.destroyAllWindows()

Как указано в комментарии, пороговое значение цвета в этом примере выполняется путем простой проверки конкретного значения BGR кадра. Более сложным решением будет преобразование кадра в цветовое пространство HSV / HSL, а затем использование cv2.inRange. Для ознакомления с этим, пожалуйста, смотрите один из моих предыдущих ответов .

Вывод вышеприведенного сценария выглядит следующим образом:

Output

Надеюсь, это поможет!

...