图像拼接匹配match

第一部分:需求分析

①基本定义

图像拼接是一种将多张具有重叠部分的图像合成为无缝全景图或高分辨率图像的技术。其核心流程包括图像配准与图像融合,通过特征点提取(如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(尺度不变特征变换) 通过以下步骤实现尺度、旋转不变性:

  1. 尺度空间极值检测

  2. 关键点定位

  3. 方向分配

  4. 关键点描述符生成

应用场景

  • 目标检测和识别

  • 图像拼接

  • 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

(6)资料4(更详细)

https://blog.csdn.net/m0_37623374/article/details/125653552

相关推荐
Yaozh、3 小时前
【神经网络中的Dropout随机失活问题】
人工智能·深度学习·神经网络
mailangduoduo3 小时前
零基础教学连接远程服务器部署项目——VScode版本
服务器·pytorch·vscode·深度学习·ssh·gpu算力
墩墩冰4 小时前
计算机图形学 实现直线段的反走样
人工智能·机器学习
Pyeako4 小时前
深度学习--卷积神经网络(下)
人工智能·python·深度学习·卷积神经网络·数据增强·保存最优模型·数据预处理dataset
OPEN-Source4 小时前
大模型实战:搭建一张“看得懂”的大模型应用可观测看板
人工智能·python·langchain·rag·deepseek
zzz的学习笔记本4 小时前
AI智能体时代的记忆 笔记(由大模型生成)
人工智能·智能体
AGI-四顾4 小时前
文生图模型选型速览
人工智能·ai
大尚来也4 小时前
一篇搞懂AI通识:用大白话讲清人工智能的核心逻辑
人工智能
Coder_Boy_4 小时前
Deeplearning4j+ Spring Boot 电商用户复购预测案例
java·人工智能·spring boot·后端·spring
风指引着方向4 小时前
动态形状算子支持:CANN ops-nn 的灵活推理方案
人工智能·深度学习·神经网络