基于最佳缝合线的多图像拼接【附python代码】

目录

  • 前言
  • 一、图像融合流程
  • 二、代码实现
    • 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子函数中加入上面利用最佳缝合线进行图像融合的代码,就可以实现多图像融合。
注意:整合代码时,要把源代码中图像融合的部分注释掉,再加入最佳缝合线的图像融合代码。


总结

在做毕设的过程中,第一次接触图像拼接这个邻域的知识,要进行拼接流程的梳理,拼接环节的功能区分,这些工作都需要我收集很多资料才能搞明白。其实网络上有很多两张图像进行拼接的代码,特征点提取、图像匹配这些操作在代码中都大同小异,这些代码的复现都很快就能完成。但是图像融合这一环节,让我卡壳了很久,不知道怎么实现最佳缝合线的融合,所以我就去找资料从头开始梳理一些能实现完整拼接的代码中每一部分具体实现的功能。但还是没有办法找到能具体实现的代码,最后靠自己理解整合了一份完整的拼接流程和代码。
本来我做的毕设题目是全景图像拼接,但在图像融合就耗费了很长时间,以至于我改善全景图像拼接的变形严重的问题时,不能更彻底地研究,只是使用了固定的圆柱面投影预处理,原本设想是根据摄像视角的不同进行不同的圆柱面投影的。还有深度学习在特征点提取上的应用也来不及研究。我的毕设就这样带着遗憾落幕了。

  • 7
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 16
    评论
根据提供的引用内容,最佳缝合线算法是一种图像拼接算法,可以有效地去除拼接中运动物体移动出现的鬼影。下面是一个基于Python最佳缝合线算法的实现示例: ```python import cv2 import numpy as np # 读取待拼接的图像 img1 = cv2.imread('image1.jpg') img2 = cv2.imread('image2.jpg') # 将图像转换为灰度图像 gray1 = cv2.cvtColor(img1, cv2.COLOR_BGR2GRAY) gray2 = cv2.cvtColor(img2, cv2.COLOR_BGR2GRAY) # 计算SIFT特征点和描述符 sift = cv2.xfeatures2d.SIFT_create() kp1, des1 = sift.detectAndCompute(gray1, None) kp2, des2 = sift.detectAndCompute(gray2, None) # 匹配特征点 bf = cv2.BFMatcher() matches = bf.knnMatch(des1, des2, k=2) # 筛选出优秀的匹配点 good = [] for m, n in matches: if m.distance < 0.75 * n.distance: good.append(m) # 获取匹配点的坐标 src_pts = np.float32([kp1[m.queryIdx].pt for m in good]).reshape(-1, 1, 2) dst_pts = np.float32([kp2[m.trainIdx].pt for m in good]).reshape(-1, 1, 2) # 计算最佳缝合线 M, mask = cv2.findHomography(src_pts, dst_pts, cv2.RANSAC, 5.0) h, w = gray1.shape pts = np.float32([[0, 0], [0, h - 1], [w - 1, h - 1], [w - 1, 0]]).reshape(-1, 1, 2) dst = cv2.perspectiveTransform(pts, M) result = cv2.polylines(img2, [np.int32(dst)], True, 255, 3, cv2.LINE_AA) # 显示拼接结果 cv2.imshow("result", result) cv2.waitKey(0) cv2.destroyAllWindows() ``` 上述代码中,我们首先读取了待拼接的两张图像,并将其转换为灰度图像。然后使用SIFT算法计算图像的特征点和描述符,并使用BFMatcher算法进行特征点匹配。接着,我们筛选出优秀的匹配点,并获取这些匹配点的坐标。最后,使用findHomography函数计算最佳缝合线,并使用perspectiveTransform函数将其应用到第二张图像上,得到拼接结果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 16
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

BW_doubleD

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值