Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/289.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 是否可以在OpenCV中将一个图像粘贴到另一个图像上?_Python_Opencv_Image Processing - Fatal编程技术网

Python 是否可以在OpenCV中将一个图像粘贴到另一个图像上?

Python 是否可以在OpenCV中将一个图像粘贴到另一个图像上?,python,opencv,image-processing,Python,Opencv,Image Processing,我是OpenCv的新手,我正在创建一个程序,使用GrabCut算法将鞋子从背景中分割出来,然后我想将鞋子粘贴到白色背景上,但我在这方面很努力 我尝试了cv2.add()将这两个图像添加到一起,但这两个图像的大小必须相同,我不能保证,因为程序会提示用户上传图像 我还尝试了whiteBgImg=255-grabCutImg在鞋子不在的地方使背景变白,但这似乎会影响最终图像,这是一个问题,因为我需要对图像执行特征检测和匹配 提前感谢您的建议!:) 原始图像: 最终图像(在grabcut和whiteB

我是OpenCv的新手,我正在创建一个程序,使用GrabCut算法将鞋子从背景中分割出来,然后我想将鞋子粘贴到白色背景上,但我在这方面很努力

我尝试了cv2.add()将这两个图像添加到一起,但这两个图像的大小必须相同,我不能保证,因为程序会提示用户上传图像

我还尝试了whiteBgImg=255-grabCutImg在鞋子不在的地方使背景变白,但这似乎会影响最终图像,这是一个问题,因为我需要对图像执行特征检测和匹配

提前感谢您的建议!:)

原始图像:


最终图像(在grabcut和whiteBgImg=255-grabCutImg应用后):

如果要将一个图像放在另一个图像的前面,可以按如下操作:

back_img[y_start:y_end,x_start:x_end] = front_img[y_start:y_end,x_start:x_end]

如果要在y轴上浓缩图像,图像的大小必须相同。为此,您可以查看或创建一个空白图像,以向图像添加填充,以及我在第一个方法中说过的“如果您想将一个图像放在另一个图像之前”。

在Python/OpenCV中有一种方法可以做到这一点

请注意,我反转了您的图像以恢复原始图像。如果在反转之前先从实际原稿开始,则跳过反转。

  • 读取输入并反转
  • 变灰
  • 制作面具的门槛
  • 创建输入大小的白色图像
  • 将两者混合在一起,用遮罩将鞋盖在白色上,以控制显示哪种颜色
  • 保存结果
输入:


反向输入以恢复原始状态:

遮罩(阈值化后清洁边界):

结果:


您的Grabcut鞋已经有了白色背景。请澄清或张贴正确的图片。也许你主持图片的地方将其更改为不支持透明度的JPG。嗨,是的,它有白色背景,但它反转了鞋子的颜色,这是一个问题,因为我需要它是原始颜色。我正在寻找解决这个问题或替代解决方案(可能添加带有白色背景图像的grabcut图像),我在下面发布了一个解决方案。如果您跳过我对输入的反转,并提供没有反转的原始输入,那么我的脚本应该按照您的要求工作。非常感谢!
import cv2
import numpy as np

# load image
img = cv2.imread("shoe_inverted.jpg")

# invert the polarity
img = 255 - img

# convert to gray
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

# threshold image and make 3 channels as mask
mask = cv2.threshold(gray, 32, 255, cv2.THRESH_BINARY)[1]
mask = cv2.merge([mask,mask,mask])

# create white image for background of result
white = np.full_like(img, (255,255,255))

# apply mask to img and white
result = np.where(mask!=0, img, white)

# write result to disk
cv2.imwrite("shoe_inverted_inverted.jpg", img)
cv2.imwrite("shoe_mask.jpg", mask)
cv2.imwrite("shoe_result.jpg", result)

cv2.imshow("IMAGE", img)
cv2.imshow("MASK", mask)
cv2.imshow("RESULT", result)
cv2.waitKey(0)
cv2.destroyAllWindows()