Загрузка библиотек и чтение изображений
from __future__ import division
import cv2
import numpy as np
guy_img = cv2.imread('path')
target_img = cv2.imread('path')
Получите ограничивающие рамки для парня (каждый ненулевой пиксель) и для маски цели (розовая область).
a = np.where(guy_img > 0)
b = np.where(target_img == 129) # picked one of the channels in your image
bbox_guy = np.min(a[0]), np.max(a[0]), np.min(a[1]), np.max(a[1])
bbox_mask = np.min(b[0]), np.max(b[0]), np.min(b[1]), np.max(b[1])
Обратите внимание , что при загрузке целевого изображения значения отличались от указанных вами.Были также белые пиксели по краям изображения.Вероятно, это было связано с тем, что изображение загружалось в imgur и загружалось.Если ваши значения верны, а остальное изображение полностью черное, за исключением розовой области, вы можете получить все ненулевые пиксели точно так же, как я сделал для изображения парня с np.where(target_img > 0)
.
Теперь получите простозначения области парня и маски
guy = guy_img[bbox_guy[0]:bbox_guy[1], bbox_guy[2]:bbox_guy[3],:]
target = target_img[bbox_mask[0]:bbox_mask[1], bbox_mask[2]:bbox_mask[3],:]
Измените размеры парня в соответствии с масштабом / формой маски
guy_h, guy_w, _ = guy.shape
mask_h, mask_w, _ = target.shape
fy = mask_h / guy_h
fx = mask_w / guy_w
scaled_guy = cv2.resize(guy, (0,0), fx=fx,fy=fy)
Переназначьте замаскированную область целевого изображения с парнемзначения изображения
for i, row in enumerate(range(bbox_mask[0], bbox_mask[1])):
for j, col in enumerate(range(bbox_mask[2], bbox_mask[3])):
target_img[row,col,:] = scaled_guy[i,j,:]
cv2.imshow('', target_img)
cv2.waitKey(0)