第一部分:需求分析

①基本定义
图像拼接是一种将多张具有重叠部分的图像合成为无缝全景图或高分辨率图像的技术。其核心流程包括图像配准与图像融合,通过特征点提取(如SIFT/SURF算法)与匹配建立几何变换关系,再采用加权平均、多频段融合等方法消除拼接痕迹。
②技术定义与目标
图像拼接通过平面单应性关联多幅图像,输出为输入图像的并集,旨在实现场景重建或分辨率增强。例如,将分段拍摄的底片拼接成宽银幕效果的照片,突破传统光学镜头的物理限制。
③关键技术步骤
1. 特征提取:
检测图像中的特征点(如SIFT算法提取关键点并计算特征向量)。
2. 图像配准:
建立图像间的几何对应关系(如通过FLANN快速匹配库或RANSAC算法剔除外点)²³。
3. 图像变形:
将图像重投影至共同参照系(如利用单应性矩阵进行透视变换)²。
第二部分:参考文献
(4)资料1(轻量)
https://blog.51cto.com/u_39037/8716304
图1:

图2:

类型1:1对1的匹配
完整代码:
import cv2#pip install opencv-python:pip install opencv-python==4.7.0.72
import numpy as np
import matplotlib.pyplot as plt
#显示函数
def show(name,img):
cv2.imshow(name,img)
cv2.waitKey(0)
cv2.destroyAllWindows()
#读入图像
img1 = cv2.imread('C:/Users/wwwju/Desktop/LORA+SAM5_cifar10/1match/box.png')
img2 = cv2.imread('C:/Users/wwwju/Desktop/LORA+SAM5_cifar10/1match/box_in_scene.png')
#sift算法实例化
sift = cv2.SIFT_create()
#提取特征点和特征向量
kp1, des1 = sift.detectAndCompute(img1, None)
kp2, des2 = sift.detectAndCompute(img2, None)
bf = cv2.BFMatcher(crossCheck=True)
#1对1匹配
matches = bf.match(des1, des2)
#将检测结果从大到小进行排序
matches = sorted(matches, key=lambda x: x.distance)
img3 = cv2.drawMatches(img1, kp1, img2, kp2, matches[:10], None,flags=2)
show('img3',img3)
"通过提取两幅图像的局部特征,找到相似的特征点,从而确定目标图像在场景图像中的位置。"

①SIFT特征提取
sift = cv2.SIFT_create()
kp1, des1 = sift.detectAndCompute(img1, None)
kp2, des2 = sift.detectAndCompute(img2, None)
-
SIFT_create(): 创建SIFT检测器实例
-
detectAndCompute(): 同时检测关键点和计算特征描述符
-
kp1,kp2: 关键点位置、尺度、方向等信息 -
des1,des2: 特征描述符(128维向量),用于特征匹配
-
②特征匹配
bf = cv2.BFMatcher(crossCheck=True)
matches = bf.match(des1, des2)
-
BFMatcher: 暴力匹配器,比较所有特征对
-
crossCheck=True: 双向交叉验证,确保匹配的一致性
-
match(): 执行特征匹配,返回匹配结果
③匹配结果排序和筛选
matches = sorted(matches, key=lambda x: x.distance)
按匹配距离从小到大排序,距离越小匹配质量越高。
算法原理:
SIFT(尺度不变特征变换) 通过以下步骤实现尺度、旋转不变性:
-
尺度空间极值检测
-
关键点定位
-
方向分配
-
关键点描述符生成
应用场景:
-
目标检测和识别
-
图像拼接
-
3D重建
-
图像检索
类型2:k对最佳匹配
核心思想:
k对最佳匹配是指,每一个特征点在另一张图片上都会有k个最匹配的点存在,例如k=2,它会给每个特征点画两根匹配线。通过对比可以过滤掉一部分点。如果需要更快速完成操作,可以尝试使用cv2.FlannBasedMatcher。
完整代码:
#读入图像
def show(name,img):
cv2.imshow(name,img)
cv2.waitKey(0)
cv2.destroyAllWindows()
import cv2#pip install opencv-python:pip install opencv-python==4.7.0.72
import numpy as np
import matplotlib.pyplot as plt
img1 = cv2.imread('C:/Users/wwwju/Desktop/LORA+SAM5_cifar10/1match/box.png')
img2 = cv2.imread('C:/Users/wwwju/Desktop/LORA+SAM5_cifar10/1match/box_in_scene.png')
#sift算法实例化
sift = cv2.SIFT_create()
#提取特征点和特征向量
kp1, des1 = sift.detectAndCompute(img1, None)
kp2, des2 = sift.detectAndCompute(img2, None)
bf = cv2.BFMatcher()
#k对最佳匹配,knnMatch中的k是一共有几组匹配
matches = bf.knnMatch(des1, des2, k=2)
#将检测结果从大到小进行排序
good = []
for m, n in matches:
if m.distance < 0.5 * n.distance:
good.append([m])
img3 = cv2.drawMatchesKnn(img1,kp1,img2,kp2,good,None,flags=2)
show('img3',img3)

(5)资料2(轻量)
https://blog.csdn.net/lovetaozibaby/article/details/107730991
(1)资料3(较详细)
https://blog.csdn.net/qq_41822859/article/details/117957122