Как заменить замаскированную часть изображения другим изображением, используя python openCV? - PullRequest
0 голосов
/ 01 марта 2019

Цель состоит в том, чтобы заменить часть изображения другим изображением.Что я планирую сделать, так это получить карту сегмента оригинальной фотографии и заменить выбранную часть оригинала другим изображением.

Например, это фотография оригинальной карты сегмента фотографии:

Segment map of original photo

И я хочу заменить эту розовую маску сегментас другой моделью парня (другой человек):

Sample guy to replace

Как мне поступить с этим?Я думаю о выборе ROI на основе розового цвета (значения RGB 192,128,128) и bitwise_and двух изображений?Но я не слишком уверен, как это сделать, или это лучший подход.

Мне известно, что розовая маска и образец не совсем подходят, но я просто хочу сначала уместить модель в розовый сегмент и, возможно, масштабировать или трансформировать ее позже.

Любые предложения будут отличными!Спасибо!

Ответы [ 2 ]

0 голосов
/ 01 марта 2019

Загрузка библиотек и чтение изображений

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)
0 голосов
/ 01 марта 2019

Прежде чем приступить к реализации, необходимо учесть несколько вещей.

  • Согласованный фон для маскирующего изображения?постоянный цвет маскируемой капли?
  • Размер маски и объекта для добавления изображения.

Я бы предложил вам сначала найти размер, цвет и расположение области интереса нарозовое сегментированное изображение.Масштабируйте размеры объекта (изображение мальчика) в соответствии с изображением маски, чтобы легче было замаскировать изображение объекта в розовую часть.

Затем можно создать изображение (пусть это будет первый шаг изображения)с размером, аналогичным маске изображения.Добавьте масштабированное изображение объекта к нему в месте, полученном из анализа розового пятна.Таким образом, у вас будет два изображения с одинаковыми размерами и одинаковым масштабом.

С первого шага изображение и Розовая РИ должны легко перекрываться визуально.

, если вы хотите точно розовый, заменитевсе пиксели на первом шаге изображения с черным пикселем, если один и тот же пиксель местоположения является черным на маскированном изображении.В противном случае пусть это будет то, что есть.

if(mask[i][j] == black){ step_one[i][j] = black }

, что оставляет розовую часть замаскированной из изображения объекта.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...