楼主: Joxes
64 0

OpenCV 第12课 图像处理—特征匹配(一) [推广有奖]

  • 0关注
  • 0粉丝

等待验证会员

学前班

80%

还不是VIP/贵宾

-

威望
0
论坛币
0 个
通用积分
0
学术水平
0 点
热心指数
0 点
信用等级
0 点
经验
30 点
帖子
2
精华
0
在线时间
0 小时
注册时间
2018-6-16
最后登录
2018-6-16

楼主
Joxes 发表于 2025-11-19 17:20:08 |AI写论文

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

求职就业群
赵安豆老师微信:zhaoandou666

经管之家联合CDA

送您一个全额奖学金名额~ !

感谢您参与论坛问题回答

经管之家送您两个论坛币!

+2 论坛币

暴力匹配

在关键点计算之后,特征描述符用于详细描绘关键点及其周边像素的信息。这种描述不仅涵盖了关键点本身,还包括了对其有贡献的周围像素点,从而为后续的目标匹配提供依据,并增强了关键点在不同条件下的不变性,例如光照和视角的变化。

暴力匹配是一种直观且直接的方法,通过遍历所有特征点的描述符,计算彼此间的距离,进而根据距离排序,最终选择距离最小的特征点作为匹配对象。尽管这种方法易于理解,但当特征点数量庞大时,其计算成本会显著增加。暴力匹配的主要流程包括:

  1. 特征点检测:利用SIFT、SURF、ORB等算法,在图像中识别出关键点。这些关键点往往位于图像的显著位置,比如角落或边缘。
  2. 特征描述:针对每一个识别到的关键点,计算其周围的像素特征描述符。这些描述符是一系列向量,旨在描述关键点附近的图像信息。常用的特征描述算法有SIFT、SURF和ORB等。
  3. 特征匹配:将一组特征点的描述符与另一组进行对比,通常通过计算描述符之间的距离(如欧氏距离或汉明距离),选取距离最近的特征点作为匹配对象。
  4. 匹配筛选:对初步匹配结果进行筛选和排序,一般按照距离进行排序,挑选出距离最短的特征点作为最优匹配点。此外,可以通过设置阈值或其他方法排除不稳定的匹配。
  5. 匹配验证和优化:进一步验证和优化匹配结果,例如采用RANSAC算法进行模型拟合和异常点剔除,以增强匹配的准确性和稳定性。

ORB算法

ORB(Oriented FAST and Rotated BRIEF)算法由Rublee等人在2011年提出,该算法结合了FAST关键点检测器和BRIEF描述符的优点,具有以下特点:

  • 计算效率高:与SIFT/SURF相比,ORB在保持旋转不变性的同时,计算速度提升了10至100倍。
  • 良好的抗噪能力:通过多尺度金字塔和方向校正技术,提高了特征的稳定性。
  • 开源且免费:基于BSD许可,无专利限制,便于广泛使用。

ORB_Create

ORB算法可通过调用cv2.ORB_create()函数进行初始化,其主要参数包括:

orb = cv2.ORB_create(
nfeatures=500,      # 最大保留特征点数量
scaleFactor=1.2,    # 图像金字塔的缩放比例
nlevels=8,          # 金字塔层数
edgeThreshold=31,    # 边缘剔除阈值
firstLevel=0,        # 金字塔起始层
WTA_K=2,            # 生成描述符时使用的点对数
scoreType=cv2.ORB_HARRIS_SCORE,  # 关键点的评分方式
patchSize=31         # 计算描述符的区域大小
)
    

该函数通过构建图像金字塔实现尺度不变性,关键参数有金字塔层数(nlevels)、缩放比例(scaleFactor)和起始层(firstLevel)。

金字塔构建原理

  • 缩放比例(scaleFactor):决定每层金字塔的分辨率下降比例,通常设置为1.2,意味着每层图像尺寸为上一层的1/1.2。
  • 层级数(nlevels):设定金字塔的总层数,默认为8层,覆盖从原始图像到1/16分辨率的多尺度特征检测。
  • 起始层级(firstLevel):指定金字塔的起始层,默认值为0,即从原始图像开始构建。

关键点检测

在每一层金字塔中独立执行FAST角点检测,确保能够捕捉到不同尺寸的特征,并将检测到的关键点位置和尺度映射回原始图像坐标系,支持跨尺度匹配。

角点检测实现

FAST关键点检测的核心在于通过比较中心像素与其周围16个像素的亮度差异来快速识别角点。若连续N个相邻像素的亮度差超过阈值T,则认为该点为角点。在OpenCV中,默认N=12(即FAST-12)。

为了实现旋转不变性,ORB算法采用灰度质心法(Intensity Centroid)计算特征点的方向。具体步骤如下:

  1. 定义矩:对于以特征点为中心的小图像块B,计算其矩 ,其中 表示像素的灰度值。
  2. 计算质心:质心C的坐标为 ,其中 为图像块的总灰度值。
  3. 确定方向:连接图像块的几何中心O与质心C,方向向量 的角度 即为特征点的主方向。
  4. 旋转不变性的实现:在生成rBRIEF描述符之前,根据主方向 旋转特征点领域内的采样点对坐标系,使得描述符对图像旋转具备鲁棒性。

检测特征点与描述符

通过调用orb.detectAndCompute(src, mask)函数,可以同时检测图像中的关键点并计算相应的描述符。该函数接受两个参数:

源图像作为输入,可以是灰度或彩色图像。

掩模图像用于定义感兴趣的区域。仅当掩模图像中相应位置的值非零时,才执行特征检测和描述符计算。

该函数返回两个值:

  • 关键点:检测到的关键点列表,每个关键点包括其在图像中的坐标及其他属性。
  • 描述符:关键点的描述符矩阵,每行代表一个关键点的描述符。

暴力匹配器

创建BFMatcher对象

cv2.BFMatcher_create(normType, crossCheck) 的两个参数分别为:

  • normType:可选参数,指定距离度量的类型。默认值为cv2.NORM_L2,即使用欧氏距离;也可以选择cv2.NORM_L1cv2.NORM_HAMMINGcv2.NORM_HAMMING2等其他类型。
  • crossCheck:可选参数,指示是否执行交叉验证。默认值为False,表示不执行交叉验证。若设为True,则只有当两个特征点的最佳匹配互为最近邻时,才视为匹配成功。

该函数返回一个暴力匹配器对象,可用于执行特征匹配。

匹配描述符

bf.match(queryDescriptors, trainDescriptors) 的两个参数分别为:

  • queryDescriptors:需匹配的图像特征向量。
  • trainDescriptors:目标匹配的图像特征向量。

bf.match 的返回值是一个 DMatch 对象列表,每个 DMatch 包含以下属性:

  • queryIdx:特征点在其所在图像中的索引。
  • trainIdx:匹配特征点在另一图像中的索引。
  • distance:描述符间的欧氏距离(数值越小,匹配度越高)。

绘制匹配结果

cv2.drawMatches(src1, kp1, src2, kp2, match, matchMask, flags) 的参数解释如下:

  • src1:第一张图像,通常是查询图像或原始图像。
  • kp1:第一张图像的关键点列表。
  • src2:第二张图像,通常是训练图像或匹配图像。
  • kp2:第二张图像的关键点列表。
  • match:匹配结果列表,包含匹配的特征点对。
  • matchesMask:确定绘制哪些匹配,为空则绘制所有匹配。
  • flags:指定绘图选项的标志位。

可用的标志位包括:

  • cv.DRAW_MATCHES_FLAGS_DEFAULT:默认的绘制模式,将在输出图像上为每个关键点绘制一个小圆圈,圆心即为特征点的位置。
  • cv.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS:此模式下,每个关键点将被绘制成带有大小和方向信息的圆圈,以更详细地展示特征点的属性。
  • cv.DRAW_MATCHES_FLAGS_DRAW_OVER_OUTIMG:使用此标志时,函数不会创建新的输出图像矩阵,而是在现有图像上直接绘制。
  • cv.DRAW_MATCHES_FLAGS_NOT_DRAW_SINGLE_POINTS:启用此标志后,未配对的单个特征点将不会被绘制。
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

关键词:图像处理 Open Pen Threshold intensity

您需要登录后才可以回帖 登录 | 我要注册

本版微信群
jg-xs1
拉您进交流群
GMT+8, 2025-12-5 17:02