Python 3.x 使用OpenCV和Python将两个图像合并为一个图像

Python 3.x 使用OpenCV和Python将两个图像合并为一个图像,python-3.x,opencv,Python 3.x,Opencv,我有两张几乎相似的图片,但有一些细节不同。我想创建一个第三个图像,其中包含所有不同的部分,同时保留相同的部分。例如,假设左边有一个红色圆圈,右边有一个蓝色三角形,我想创建一个图片,左边有一个红色圆圈,右边有一个蓝色三角形 我试过使用cv2.add但不起作用,我试过使用cv2.addweighted但它只在图像背景为黑色且我将权重设置为1时起作用。我还能怎么做呢?我可以使用另一个库而不是OpenCV来简化我的生活吗 这是我想要的输出: import cv2 img1 = cv2.imread('

我有两张几乎相似的图片,但有一些细节不同。我想创建一个第三个图像,其中包含所有不同的部分,同时保留相同的部分。例如,假设左边有一个红色圆圈,右边有一个蓝色三角形,我想创建一个图片,左边有一个红色圆圈,右边有一个蓝色三角形

我试过使用
cv2.add
但不起作用,我试过使用
cv2.addweighted
但它只在图像背景为黑色且我将权重设置为
1
时起作用。我还能怎么做呢?我可以使用另一个库而不是OpenCV来简化我的生活吗

这是我想要的输出:

import cv2

img1 = cv2.imread('RedCircle.png')
img2 = cv2.imread('BlueTriangle.png')
img3 = cv2.add(img1,img2)

cv2.imshow('res',img3)
cv2.waitKey(0)
cv2.destroyAllWindows()
如果我使用此代码,我会得到一个空白屏幕:


在Python/OpenCV中有一种方法可以做到这一点。只是简单地添加是不起作用的

  • 读取两个输入图像
  • 将第二个转换为灰度和阈值作为遮罩
  • 使用图像1上的遮罩执行按位和
  • 使用图像2上的反转遮罩按位执行和
  • 将两个遮罩图像添加到一起
  • 保存结果

图1(从webp转换为png以供查看):

图2(从webp转换为png以供查看):


阈值三角形图像:

遮罩圆图像:

遮罩三角形图像:

组合遮罩图像:


您不需要编写任何Python来完成此操作,只要在终端中键入ImageMagick one liner(如果有选择的话)?只需使用cv2将两个图像添加在一起。添加(左、右),其中左、右是您显示的两个图像。以后,请分别发布图片。这使人们更容易使用您的图像。发布你的代码。如果两个图像的形状和数据类型完全相同,那么cv2.add应该可以正常工作。如果我照你说的做,使用cv2.add,它就不工作了,我得到一个空白图像。你的平台是什么?你有需要的WEBP阅读器吗?您是否查看了img1和img2以查看图像是否正确读取?我正在用Python编写代码,img1和img2是否正确读取,只有在使用cv2.add时才会出现此问题
import cv2
 
img1 = cv2.imread('circle.webp')
print(img1.shape)

img2 = cv2.imread('triangle.webp')
print(img2.shape)

gray2 = cv2.cvtColor(img2, cv2.COLOR_BGR2GRAY)
thresh2 = cv2.threshold(gray2, 0, 255, cv2.THRESH_BINARY+cv2.THRESH_OTSU)[1]

result1 = cv2.bitwise_and(img1, img1, mask=thresh2)
result2 = cv2.bitwise_and(img2, img2, mask=255-thresh2)
result = cv2.add(result1, result2)

cv2.imwrite("triangle_thresh.png", thresh2)
cv2.imwrite("circle_masked.png", result1)
cv2.imwrite("triangle_masked.png", result2)
cv2.imwrite("circle_triangle_combined.png", result)

cv2.imshow('img1',img1)
cv2.imshow('img2',img2)
cv2.imshow('thresh2',thresh2)
cv2.imshow('result1',result1)
cv2.imshow('result2',result2)
cv2.imshow('result',result)
cv2.waitKey(0)
cv2.destroyAllWindows()