OpenCV确定相交/重叠区域的面积。

9
我正在使用OpenCV和Python创建一个拼接程序,成功拼接了图像,现在正在尝试将它们混合在一起。最终目标是使用图形剪切来更好地缝合它们,但现在我只是基于发现的单应性,重叠这些图像。

这是当我拼接两张图像时的当前结果照片。 enter image description here

我的目标是确定重叠区域,并将其放入一个掩码中,然后将其应用到右上角的图像(即在图层方面位于顶部的图像),因此我可以根据距离使用任何OpenCV使用的融合器或其他算法进行混合。

这是我正在寻找的可视化效果。 enter image description here

非常感谢您的帮助。

1个回答

8
如何创建两个图像的掩模/二进制图像并使用逻辑AND?
您还可以将每个图像的灰度副本(图像内容全部为1)翻译到目标的新副本中(初始化为零)。
然后将所有这些目标图像相加。 0 的区域将会是未覆盖的,1 覆盖,2 到 n 将意味着被 2 到 n 张图像覆盖。
在使用 numpy 的广播工具时,这非常容易和高效。
import cv2
import numpy as np

#our target area (the black background)
dst = np.zeros((100,100),dtype=np.int)
src1 = dst.copy() 
src2 = dst.copy()
src1[50:,50:] = 1 #fake of first translated image (row/col 50-end)
src2[:70,:70] = 1 #fake of second translated image (row/col 0-70)

overlap = src1+src2 #sum of both *element-wise*

cv2.imwrite('a.png', src1*255) #opencv likes it's grey images span from 0-255
cv2.imwrite('b.png', src2*255) #...
cv2.imwrite('c.png', overlap*127) #here vals 0-2, *127 gives (almost) 255 again

np.where(overlap==2) #gives you a mask with all pixels that have value 2

src2 (b) 输入图像描述 + src1 (a) 输入图像描述 = overlap (c) 输入图像描述

希望能帮到您。


谢谢,伙计,这让我很清楚。我理解这个概念,但如何规范化图像区域呢?我的问题是结果图像是一个单一的图像,而不是带有多个图层的图像。 - C.Radford
谢谢,伙计。你的代码很好用,只有一个小问题。dst = np.zeros((100,100),dtype=np.int) 应该改为 dst = np.zeros((100,100),np.uint8)。这真的帮了我很多,谢谢。 - C.Radford
@C.Radford,你找到计算两个图像重叠区域的方法了吗?我也在解决图像拼接的类似问题。我需要重叠区域来寻找缝合线。 - Adi shukla
抱歉 @Adishukla,我没有。 - C.Radford
@Adishukla: 抱歉,我以为很明显矩形不需要完全填充 - 也不需要是正方形。你将拥有的每个形状,“涂”在一个矩形内并重叠矩形。对于上面的例子,假设没有图像像素是黑色的。因此,您可以制作两个总矩形大小的矩形,并为每个补丁设置所有非零像素为1。您重叠两个矩形,并将在每个重叠位置上获得值2。 - RuDevel
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接