Как скопировать часть изображения в другую с помощью OpenCV? - PullRequest
0 голосов
/ 08 мая 2018

У меня есть модель, которая предсказывает сегментацию человеческого лица.

image description

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

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

Код, использованный для создания предыдущего рисунка:

fn = "images/beard.jpg"
im = cv2.cvtColor(cv2.imread(fn), cv2.COLOR_BGR2RGB)
im = auto_downscaling(im)

# vgg_preprocess: output BGR channel w/ mean substracted.
inp_im = vgg_preprocess(im)

# Predicting the face segmentation
out = model.predict([inp_im])

out_resized = cv2.resize(np.squeeze(out), (im.shape[1],im.shape[0]))
out_resized_clipped = np.clip(out_resized.argmax(axis=2), 0, 1).astype(np.float64)
mask = cv2.GaussianBlur(out_resized_clipped, (7,7), 6)


plt.figure(figsize=(12,6))
plt.subplot("131")
plt.axis('off')
plt.imshow(im)
plt.subplot("132")
plt.axis('off')
plt.imshow(out_resized_clipped, cmap='gray')
plt.subplot("133")
plt.axis('off')
plt.imshow((mask[:,:,np.newaxis]*im.astype(np.float64)).astype(np.uint8))
plt.show()

1 Ответ

0 голосов
/ 08 мая 2018

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

import cv2
import numpy as np

def resize(img, dim=(300, 300)):
    # perform the actual resizing of the image and show it
    frame = cv2.resize(img, dim, interpolation=cv2.INTER_AREA)
    return frame

Затем прочитайте и измените размеры изображений отдельно

img1 = resize(cv2.imread('img1.png'))
img2 = resize(cv2.imread('img2.png'))
dst = cv2.addWeighted(img1,0.7,img2,0.3,0)

Функция cv2.addWeighted поможет мне достичь результата. тогда вы можете сделать как вам нужно с выводом

cv2.imwrite('out.png', dst)

Так что применение этого же принципа к вашему коду было бы чем-то вроде. Я вижу, что у вас есть изображения такого же размера.

fn = "images/beard.jpg"
im = cv2.cvtColor(cv2.imread(fn), cv2.COLOR_BGR2RGB)
im = auto_downscaling(im)

# vgg_preprocess: output BGR channel w/ mean substracted.
inp_im = vgg_preprocess(im)

# Predicting the face segmentation
out = model.predict([inp_im])

out_resized = cv2.resize(np.squeeze(out), (im.shape[1],im.shape[0]))
out_resized_clipped = np.clip(out_resized.argmax(axis=2), 0, 1).astype(np.float64)
out_resized_clipped = cv2.GaussianBlur(out_resized_clipped, (7,7), 6)

mask = cv2.addWeighted(out_resized, 0.7, out_resized_clipped,0.3,0)
mask = cv2.GaussianBlur(out_resized_clipped, (7,7), 6)

plt.figure(figsize=(12,6))
plt.subplot("131")
plt.axis('off')
plt.imshow(im)
plt.subplot("132")
plt.axis('off')
plt.imshow(out_resized_clipped, cmap='gray')
plt.subplot("133")
plt.axis('off')
plt.imshow((mask[:,:,np.newaxis]*im.astype(np.float64)).astype(np.uint8))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...