使用Python使用OpenCV将两个图像合并为一个图像

时间:2020-09-05 16:55:16

标签: python-3.x opencv

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

我尝试使用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()

如果我使用此代码,则会出现空白屏幕:

1 个答案:

答案 0 :(得分:0)

这是在Python / OpenCV中执行此操作的一种方法。只是简单地添加是行不通的。

  • 读取两个输入图像
  • 将第二个转换为灰度和阈值作为蒙版
  • 按位操作并在图像1上使用遮罩
  • 按位并在图像2上使用倒置蒙版
  • 将两个蒙版图像加在一起
  • 保存结果

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

enter image description here

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

enter image description here

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

阈值三角形图像:

enter image description here

蒙版圆圈图片:

enter image description here

遮罩的三角形图像:

enter image description here

合并的蒙版图像:

enter image description here