如何使用OpenCV将图像的一部分复制到另一部分?

时间:2018-05-08 11:41:33

标签: python numpy opencv

我有一个预测人脸分割的模型。

image description

但不幸的是,该模型没有经过训练来预测脸部的头发。所以现在我将上面的图像作为numpy数组。是否可以将原始照片(左边的那个)的头发添加到预测蒙版(中间)或者直接添加到结果预测(右边的那个)?

基本上我只需要处理原始图像,从预测蒙版上方的头部稍微加一点,然后将其添加到预测中,这样至少我会在结果中有一部分头发

用于创建上图的代码:

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 :(得分:1)

为了展示你想要的东西我测试了这个。首先,我创建了一些函数来从输入创建类似大小的图像。

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))