基于最佳缝合线的多图像拼接【附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子函数中加入上面利用最佳缝合线进行图像融合的代码,就可以实现多图像融合。
注意:整合代码时,要把源代码中图像融合的部分注释掉,再加入最佳缝合线的图像融合代码。


总结

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

对于最佳缝合线融合算法图像拼接Python 实现,我可以提供一些参考资料和代码示例,但具体实现细节需要根据具体情况进行调整和优化。以下是一个基于 OpenCV 库的 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) # 使用 FLANN 匹配器进行特征点匹配 FLANN_INDEX_KDTREE = 0 index_params = dict(algorithm=FLANN_INDEX_KDTREE, trees=5) search_params = dict(checks=50) flann = cv2.FlannBasedMatcher(index_params, search_params) matches = flann.knnMatch(des1, des2, k=2) # 筛选出最佳匹配点对 good_matches = [] for m, n in matches: if m.distance < 0.7 * n.distance: good_matches.append(m) # 计算图像间的变换矩阵 src_pts = np.float32([kp1[m.queryIdx].pt for m in good_matches]).reshape(-1, 1, 2) dst_pts = np.float32([kp2[m.trainIdx].pt for m in good_matches]).reshape(-1, 1, 2) M, mask = cv2.findHomography(src_pts, dst_pts, cv2.RANSAC, 5.0) # 将第二张图像变换到第一张图像的坐标系中 h, w = gray1.shape warped_img2 = cv2.warpPerspective(img2, M, (w, h)) # 将两张图像进行融合 blend_img = cv2.addWeighted(img1, 0.5, warped_img2, 0.5, 0) # 显示拼接结果 cv2.imshow('Blend Image', blend_img) cv2.waitKey(0) cv2.destroyAllWindows() ``` 这段代码实现了基于 SIFT 特征点匹配和 RANSAC 算法图像拼接,可以将两张图像进行无缝融合。如果需要更高效的实现,可以考虑使用 GPU 加速或者其他更高级的算法
评论 17
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

BW_doubleD

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

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

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

打赏作者

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

抵扣说明:

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

余额充值