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

Python 如何使用OpenCV将图像的一部分复制到另一部分?,python,numpy,opencv,Python,Numpy,Opencv,我有一个预测人脸分割的模型 但不幸的是,该模型没有经过训练来预测面部的头发。现在我将上面的图像作为numpy数组。是否可以将原始照片中的头发添加到左边的一个到预测掩码中,或者直接到结果预测右边的一个? 基本上,我只需要处理原始图像,从预测遮罩上方的头部获取一点信息,并将其添加到预测中,这样至少我会在结果中保留一部分头发 用于创建上一个图形的代码: fn = "images/beard.jpg" im = cv2.cvtColor(cv2.imread(fn), cv2.COLOR_BGR2RGB

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

但不幸的是,该模型没有经过训练来预测面部的头发。现在我将上面的图像作为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()

为了证明你想要什么,我测试了这个。首先,我创建一些函数,从输入创建相似大小的图像

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

嗨,伙计,我真的很感谢你的帮助。。我得到了你的代码,但是我得到了这个错误掩码=cv2.addWeightedout\u resized,0.7,out\u resized\u clipped,0.3,0 cv2.error:/Users/travis/build/skvark/opencv python/opencv/modules/core/src/arithm.cpp:659:error:-209这个操作既不是数组大小和通道数相同的“array op array”,也不是“array op scalar”,也不是函数算术中的“标量运算数组”我不明白那是什么?对不起,关于这个。似乎图像数据不是错误中所述的数组。但是,如果您键入cv2.imwrite'img1.png',在指定掩码行之前将其大小调整为out_,会发生什么@艾哈迈德萨姆韦特再次,请使用一个通用的调整大小功能,以创建统一大小的图像这可能会有所帮助。对不起,但我没有得到你的评论?!我该怎么办?我还不确定,但我以前在某个项目中用它合并了两个图像片段。但图像必须具有相同的尺寸