Изменение формы изображения, чтобы оно приняло форму закрытого изображения с помощью Python

Я новичок в Python. Я хотел бы деформировать первое изображение так, чтобы оно заполнило закрытый путь второго изображения. У меня есть два изображения. Одно из них является исходным изображением, а другое — вложенным изображением. Можно ли заполнить изображение любым закрытым путем. Не могли бы вы предложить библиотеки Python для использования или было бы здорово, если бы вы могли поделиться некоторым кодом. Я также пытался работать с алгоритмами обнаружения углов и заставить их придерживаться функции карты, но не могу.

Два изображения и конечный результат, который я ожидаю получить:

Два изображения и конечный результат, который я ожидаю получить


person Prem Rishi    schedule 23.04.2020    source источник
comment
Я не думаю, что это возможно. Но вы можете развернуть первое изображение и наложить его поверх второго.   -  person fmw42    schedule 23.04.2020
comment
Не могли бы вы вкратце рассказать о части расширения и укладки с некоторым кодом, если это возможно?   -  person Prem Rishi    schedule 24.04.2020


Ответы (1)


Вот пример наложения одного изображения на другое с помощью маски с помощью Python/OpenCV.

изображение футболки:

введите здесь описание изображения

изображение шаблона:

введите здесь описание изображения

изображение маски футболки:

введите здесь описание изображения

 - Read the 3 images and get shapes
 - Convert the mask to gray and binarize
 - Resize the pattern so that its smallest dimension is the size of the largest dimension of the tshirt image
 - Crop it to exactly the same size as the tshirt image
 - Apply the mask to the pattern image
 - Apply the inverse mask to the tshirt image
 - Add the two together
 - Save the results


import cv2
import numpy as np

# read shirt image and get its max dimension
img = cv2.imread('tshirt.jpg')
hh, ww = img.shape[:2]
maxwh = max(hh, ww)

# read pattern image and get its size and minimum dimension
pattern = cv2.imread('tshirt_pattern.jpg')
ht, wd = pattern.shape[:2]
minwh = min(ht,wd)

# read shirt mask image
maskimg = cv2.imread('tshirt_mask.png')

# convert mask to gray and binarize
maskimg = cv2.cvtColor(maskimg, cv2.COLOR_BGR2GRAY)
maskimg = cv2.threshold(maskimg, 128, 255, cv2.THRESH_BINARY)[1]

# resize pattern so minimum dimension is size of largest dimension of tshirt image
scale = maxwh/minwh
pattern_enlarge = cv2.resize(pattern, dsize=(0,0), fx=scale, fy=scale)

# limit resized pattern to size of tshirt
pattern_enlarge = pattern_enlarge[0:hh, 0:ww]

# do masked overlay
pattern_masked = cv2.bitwise_and(pattern_enlarge, pattern_enlarge, mask=maskimg)
img_masked = cv2.bitwise_and(img, img, mask=(255-maskimg))
result = cv2.add(img_masked, pattern_masked)

cv2.imshow('image', img)
cv2.imshow('pattern', pattern)
cv2.imshow('mask', maskimg)
cv2.imshow('masked pattern', pattern_masked)
cv2.imshow('masked image', img_masked)
cv2.imshow('result', result)
cv2.waitKey(0)
cv2.destroyAllWindows()

# save results
cv2.imwrite('tshirt_masked.jpg', img_masked)
cv2.imwrite('pattern_masked.jpg', pattern_masked)
cv2.imwrite('tshirt_pattern_overlay.jpg', result)


замаскированное изображение шаблона:

введите здесь описание изображения

изображение футболки в маске:

введите здесь описание изображения

изображение результата:

введите здесь описание изображения

person fmw42    schedule 24.04.2020