目录
- 前言
- 一、图像融合流程
- 二、代码实现
- 1.搜索最佳缝合线
- 2.使用最佳缝合线路径进行图像融合
- 3.使用最佳缝合线路径进行多图像融合
- 总结
知识分享时,如果引用了本文内容,麻烦标明出处。
前言
做毕设的过程中,搜索资料,没办法找到使用最佳缝合线进行图像融合的完整代码,后面根据一些搜索最佳缝合线的代码,再结合自己的理解,把完整的代码写了出来,所以用这篇文章记录一下。
参考的资料:
python最佳缝合线(Image Stitching 2)
未使用最佳缝合线的多图像拼接
一、图像融合流程
根据python最佳缝合线(Image Stitching 2)中,搜索最佳缝合线时,要构造的能量函数的公式可知,首先要得到两张待拼接图像的重叠区域,用于最佳缝合线的搜索。
重叠区域,即红色矩阵区域:
假设要拼接的图像只有两张,分别为待拼接左图和待拼接右图。上示图像,表示待拼接右图(图像1)利用单应性矩阵进行图像变换后,产生了与待拼接左图(图像2)重叠的区域。根据图像1变换后最左的端点left与图像2最右的两个端点,构造了红色矩阵区域,即用来搜索最佳缝合线的重叠区域。
寻找重叠区域的代码如下:
imageA是待拼接右图,需要进行图像变换的图,imageB是待拼接左图,imageA、imageB1是最终得到的重叠区域。
h1, w1 = imageA.shape[:2]
pts1 = np.float32([[0, 0], [0, h1], [w1, h1], [w1, 0]]).reshape(-1, 1, 2)
pts2 = cv2.perspectiveTransform(pts1, Homography)
points=[pts2[0][0],pts2[1][0]]
leftmost = min(points, key=lambda p: p[0])
imageB1=imageB[:,int(leftmost[0]):,:]
imageA1=result_image[:,int(leftmost[0]):imageB.shape[1],:]
二、代码实现
1.搜索最佳缝合线
使用python最佳缝合线(Image Stitching 2)提供的搜索最佳缝合线的子函数,该子函数返回的是最佳缝合线的路径。这个路径表示为一个数组,记为A。A[0]表示为重叠图像中第0行的列数,A[1]表示为重叠图像中第1行的列数,以此类推。
2.使用最佳缝合线路径进行图像融合
C记录了搜索得到的最佳缝合线路径,result_image是最终的融合图像。
代码如下:
C = self.optimal_seam_rule2(imageB1, imageA1)
C=C+int(leftmost[0])
for i in range(len(C)):
result_image[i, 0:C[i]] = imageB[i, 0:C[i]]
#绘制接缝线
for i in range(len(C) - 1):
cv2.line(result_image, (C[i], i), (C[i + 1], i + 1), (0, 255, 0), 1)
#去除多余的黑边
result_image=self.capture_image(result_image)
效果图(a为经过图像变换后的待拼接右图,b为绘制出最佳缝合线的拼接图):
3.使用最佳缝合线路径进行多图像融合
在未使用最佳缝合线的多图像拼接的代码基础上,进行修改。在panorama.py中,image_stitch子函数中加入上面利用最佳缝合线进行图像融合的代码,就可以实现多图像融合。
注意:整合代码时,要把源代码中图像融合的部分注释掉,再加入最佳缝合线的图像融合代码。
总结
在做毕设的过程中,第一次接触图像拼接这个邻域的知识,要进行拼接流程的梳理,拼接环节的功能区分,这些工作都需要我收集很多资料才能搞明白。其实网络上有很多两张图像进行拼接的代码,特征点提取、图像匹配这些操作在代码中都大同小异,这些代码的复现都很快就能完成。但是图像融合这一环节,让我卡壳了很久,不知道怎么实现最佳缝合线的融合,所以我就去找资料从头开始梳理一些能实现完整拼接的代码中每一部分具体实现的功能。但还是没有办法找到能具体实现的代码,最后靠自己理解整合了一份完整的拼接流程和代码。
本来我做的毕设题目是全景图像拼接,但在图像融合就耗费了很长时间,以至于我改善全景图像拼接的变形严重的问题时,不能更彻底地研究,只是使用了固定的圆柱面投影预处理,原本设想是根据摄像视角的不同进行不同的圆柱面投影的。还有深度学习在特征点提取上的应用也来不及研究。我的毕设就这样带着遗憾落幕了。