编程学习
🖼️C++OpenCV(17):特征检测算法
00 分钟
2023-9-23
2023-11-23
type
status
date
slug
summary
tags
category
icon
password
Email
💡
水寒江静,满目青山,载月明归。——黄庭坚《诉衷情》
🔆
文章首发于我的个人博客:欢迎大佬们来逛逛

opencv SIFT特征检测

尺度不变特征转换(Scale-invariant feature transform或SIFT)是一种电脑视觉的算法用来侦测与描述影像中的局部性特征,它在空间尺度中寻找极值点,并提取出其位置、尺度、旋转不变量,此算法由 David Lowe在1999年所发表,2004年完善总结。 其应用范围包含物体辨识、机器人地图感知与导航、影像缝合、3D模型建立、手势辨识、影像追踪和动作比对。
SIFT算法是为了解决图片的匹配问题,想要从图像中提取一种对图像的大小和旋转变化保持鲁棒的特征,从而实现匹配。这一算法的灵感也十分的直观:人眼观测两张图片是否匹配时会注意到其中的典型区域(特征点部分),如果我们能够实现这一特征点区域提取过程,再对所提取到的区域进行描述就可以实现特征匹配了。

SIFT算法大致流程

高斯金字塔

  • 人看物体时近大远小,可以对图片下采样实现
  • 远处模糊,可以对图像高斯平滑实现

高斯差分金字塔特征提取

  • 获取了不同尺度的图片
  • 获取高频区域(边缘检测的算法使用差分滤波器如拉普拉斯滤波器、sobel滤波器)

特征点处理

  • 阈值化操作(去噪)
  • 非极大值抑制
  • 二阶泰勒修正
  • 低对比度去除
  • 边缘效应去除

描述特征点

  • 确定特征点区域方向
  • 特征点区域描述子

API介绍

opencv FAST特征检测

FAST(features from accelerated segment test)是基于⾓点检测的图像特征,是公认的比较快速的特征点检测方法,只利用周围像素比较的信息就可以得到特征点,简单,有效。很多传统的算法都很耗时,而且特征点检测算法只是很多复杂图像处理里中的第一步,得不偿失。FAST算法思想是若某像素与其周围领域内足够多的像素点相差较大,则该像素可能是角点

FAST算法大致流程

  • 确定候选角点
  • 非极大值抑制

API介绍

 

opencv BRISK特征检测

BRISK(Binary Robust Invariant Scalable Keypoints)是一种二进制的特征描述算子。它具有较好的旋转不变性、尺度不变性,较好的鲁棒性(稳定性)等。在对有较大模糊的图像配准时,BRISK算法在其中表现最为出色。对描述子匹配时,采用汉明距离,进行二值匹配。
汉明距离:它表示两个(相同长度)字对应位不同的数量,我们以d(x,y)表示两个字x,y之间的汉明距离。对两个字符串进行异或运算,并统计结果为1的个数,那么这个数就是汉明距离。例如:1011101 与 1001001 之间的汉明距离是 2。

BRISK算法大致流程

  • 建立尺度空间
  • 特征点检测
  • 非极大值抑制
  • 亚像素插值
  • 特征点描述
    • 高斯滤波
    • 局部梯度计算

API介绍

opencv ORB特征检测

ORB在2011年才首次发布,ORB算法将基于FAST关键点的技术和基于BRIEF描述符的技术相结合,但是ORB并没有解决尺度不一致的问题,在OpenCV的ORB实现中采用了图像金字塔来改善这方面的性能,我们通过构建高斯金字塔,然后在每一层金字塔图像上检测角点,来实现尺度不变性。ORB主要解决了BRIEF描述子不具备旋转不变性的问题。 BRIEF是一种特征描述子提取算法,并非特征点的提取算法,一种生成二值化描述子的算法,不提取代价低,匹配只需要使用简单的汉明距离(Hamming Distance)利用比特之间的异或操作就可以完成。因此,时间代价低,空间代价低,效果还挺好是最大的优点。

ORB算法大致流程

  • 建立图像金字塔
  • FAST算法寻找特征点
  • 给关键点分配方向
  • 通过BRIEF算法创建特征向量,得到特征描述符

API介绍

opencv MSER特征检测

MSER是极值区域检测算法,MSER类根据输入参数判断是否为彩色or灰度图像进行不同的算法检测。若输入为灰度图像,那么采取MSER极值区域检测算法,若输入为彩色图像,则采用MSCR极值区域检测算法,可以用于图像的斑点区域检测。业界认为是性能最好的仿射不变区域,MSER是当使用不同的灰度阈值对图像进行二值化时得到的最稳定的区域,特点:
  • 对于图像灰度的仿射变化具有不变性
  • 稳定性,区域的支持集相对灰度变化稳定
  • 可以检测不同精细程度的区域

MSER算法大致流程

  • 使用一系列灰度阈值对图像进行二值化处理
  • 对于每个阈值得到的二值图像,得到相应的黑色区域与白色区域
  • 在比较宽的灰度阈值范围内保持形状稳定的区域就是MSER特征
  • 评判标准: dA/dtA: 二值图像区域面积,t: 灰度

API介绍

opencv SimpleBlob特征检测

SimpleBlob是检测斑点类的特征点,斑点本质其实是一组连通的像素在图像中共享一些共同的属性(如灰度值、颜色等)

SimpleBlob检测大致流程

  • 图像分割(例如阈值化操作)
  • 连通性分析
  • 特征量计算

API介绍

opencv KAZE特征检测

KAZE算法是由法国学者在在2012年的ECCV会议中提出的,是一种比SIFT更稳定的特征检测算法。KAZE算法是基于非线性尺度空间的算法,KAZE 特征对旋转、尺度、有限仿射具有不变性,并且在不同尺度上具有更多的独特性,但代价是计算时间适度增加。
KAZE算法与SIFT算法不一样,它采用的是非线性扩散滤波法。 具体地,非线性扩散滤波法是将图像亮度(L)在不同尺度上的变化视为某种形式的流动函数(flow function)的散度(divergence),可以通过非线性偏微分方程来描述:
通过设置合适的传导函数 c(x,y,t) ,可以使得扩散自适应于图像的局部结构。传导函数可以是标量、也可以是张量。时间t作为尺度参数,其值越大、则图像的表示形式越简单。 Perona和Malik提出了传导函数的构造方式:
其中函数g1优先保留高对比度的边缘,g2优先保留宽度较大的区域,g3能够有效平滑区域内部而保留边界信息(KAZE代码中默认采用函数g2) 。

API介绍

opencv AKAZE特征检测

AKAZE是KAZE的加速版,和SIFT特征检测一样,它也可以检测图像的特征点,和描述子但是它与SIFT的比较:
  • 更加稳定,更加迅速;
  • 非线性尺度空间,得到的关键点更准确
  • 比较新的算法。
AKAZE 特征对尺度、旋转、有限仿射具有不变性,并且由于非线性尺度空间,在不同尺度上具有更多的独特性。

API介绍

opencv GFTT特征检测

GFTT (Good Features to Track),GFTT 是一个特征检测器。 GFTTDetector 使用 Harris(以创建者命名)和 GFTT 角点检测算法检测特征。 所以,这个类实际上是两种特征检测方法合二为一,原因是GFTT实际上是Harris算法的修改版本,使用哪一种将由输入参数决定。 GFTT特征点检测器和OpenCV中其他特征点检测器有一个很大的不同之处,那就是GFTT特征点检测器只支持提取特征点,而不支持计算描述子。

API介绍

opencv AGAST特征检测

AGAST(Adaptive and Generic Accelerated Segment Test)角点域的特征匹配算法是一种计算二元决策树(角检测器)的技术, 通过组合两棵树,角点检测器自动适应环境,并为图像区域提供最有效的决策树,只有一个像素延迟。因此,它产生了一个角检测器,该检测器速度更快且无需进行训练,同时保持与(完整)FAST 角检测器相同的角响应和可重复性。我们将此检测器称为 AGAST。

API介绍

 

评论
  • Twikoo
  • Valine