Advertisement

OpenCV4学习笔记(40)——FAST特征提取算法与BRIEF特征描述算法

阅读量:

在上一篇博文《OpenCV4学习笔记(38)》中记载的SIFT算法是一种包含特征提取与描述在内的核心方法;而今天的工作重点则是系统梳理分别用于图像特征提取与描述两大模块的具体实现——FAST用于特征提取、BRIEF用于特征描述

FAST(Features from Accelerated Segment Test)特征提取算法是一种具有显著效率的特征提取方法。该算法通过加速计算过程来实现对目标物体关键部位的快速定位,并以其较高的运算速度和一定的准确性而著称,在计算机视觉领域得到了广泛应用。然而,在面对光照条件复杂或存在阴影等特殊情况下的图像时,该方法的表现却大打折扣。

FAST特征提取算法的核心在于识别图像中的关键区域。该算法通过分析某个pixel及其周围区域的变化情况来确定其重要性。当满足特定条件时,则认为该center pixel为显著特征。相反,在缺乏上述条件下,则判定该pixel为非关键point并予以淘汰。

考虑一个位于图像中心的像素点p,并通过半径为3的离散圆选取其邻域区域;从而使得该中心pixels p被周围16个pixels所环绕,并按照以下方式对周围的16个neighborhood pixels进行编号

复制代码
     				         			16  1  2
    								 15					3										
    							  14						4		
    							  13		   p			5
    							  12						6
    								 11					7
    									    10  9  8

若围绕p的16邻域内有n连贯的像元呈现出一致的变化趋势,则其灰度均高于I(p) + t或皆低于I(p) - t时可断定该中心像元p即为此特征区域。(此处t代表设定阈值界限而I(p)则表示该中心像元本身的亮度值)

当n设定为12时,可以通过以下两步快速筛选出非特征像素点:首先,通过计算delta1 = |I(1) - I(p)| 和 delta9 = |I(9) - I(p)| 的绝对值差值来判断中心像素p是否为非特征点;如果delta1和delta9都小于阈值t,则中心像素p被排除;否则顺利通过后续筛选阶段。

计算(delta_5)等于|I(5)-I(p)|的绝对值,并计算(delta_13)等于|I(13)-I(p)|的绝对值;若其中三个参数超过阈值(t),则将中心像素点(p)标记为特征点;否则不将其视为特征点。

经过上述两个步骤,就得到使用FAST算法提取出来的特征点了。

在算法过程中设定的参数t具有双重意义:它既是FAST算法能够探测到的特征点所具有的最低对比度(即系统能够承受的最大噪声水平),同时也是系统能够接受的最大噪声水平。值得注意的是,在传统的FAST算法中,默认设置该参数为定值,在面对光照环境变化较大的图像时,默认设置该参数为定值,则会导致其鲁棒性较差进而使其鲁棒性较差。因此,在实际应用中建议采用自适应机制来优化该参数t的具体取值范围(即系统能够承受的最大噪声水平),从而使得基于 FAST 算法的特征点提取效率得到显著提升(面对光照环境变化较大的图像)。

在OpenCV中已经集成提供了FAST算法的API即FastFeatureDetector这个类。为了实现该算法的功能我们需要调用FastFeatureDetector::create()来生成一个FAST特征检测器对象其中参数说明如下:

第一个参数thresh:就是算法过程中的阈值t,默认值为10;

第二个参数nonmaxSuppression:布尔类型,默认设置为true(即启用非极大值抑制机制)。当某个目标区域内的特定像素点(称为中心像素)在其所在区域中不是亮度最高的像素时,则该中心像素会被移除;反之则会予以保留。若将该参数设置为false(关闭非极大值抑制),则会放弃这一处理步骤。

该字段用于指定领域类型,并包含以下几种可选设置:TYPE\_5\_8TYPE\_7\_12TYPE\_9\_16。其中,默认设置为 TYPE\_9\_16.

在完成 FAST 特征检测器搭建后, 我们能够 从而 通过 detect() 方法 进行 基于 FAST 算法 的 特征点 检测, 最终 获取 该 图像 的关键 点位置 信息.

下面是代码演示:

复制代码
    	auto fast = FastFeatureDetector::create(20,true,FastFeatureDetector::DetectorType::TYPE_9_16);
    	Mat image = imread("D:\ opencv_c++\ opencv_tutorial\ data\ images\ tem.jpg");
    	vector<KeyPoint> keyPoints;
    	fast->detect(image, keyPoints, Mat());
    	Mat result;
    	drawKeypoints(image, keyPoints, result, Scalar::all(-1), DrawMatchesFlags::NOT_DRAW_SINGLE_POINTS);
    	imshow("image", image);
    	imshow("result", result);

看一下提取出的FAST特征点:

在这里插入图片描述
在这里插入图片描述

完成之后还需对特征点进行命名即进行特征描述的工作

BEIEF特征描述算法 BRIEF(Binary Robust IndependentElementary Features-二进制健壮独立特征)是一种用于计算特征描述子的方法,在实际应用中通常用于赋予图像中的关键点独特的名称以便于后续匹配过程的进行因此在实现这一功能之前必须首先从图像中提取出这些关键点

通过FAST特征点识别算法或Harris·shi-tomas角点检测算法或SIFT·SURF等方法预先识别图像中的特征点,在这些特征点的邻域内应用BRIEF技术构建二进制描述符

在OpenCV官方指南中推荐采用STAR特征检测算法与BRIEF特征描述算法相结合的方式进行图像处理。STAR检测器源自CenSurE算法体系下的特征识别技术。然而与CenSurE方法相比 STAR采用了不同的逼近策略 即用正方形 六边形以及八边形等多边形来近似圆形形状 这种结构类似于由两个相互垂直的正方形组成的圆形结构 但这种形状设计是双层叠加形成 外围较宽 内围较窄 可将其视为外围较宽内圈较窄的复合多边形 边界与封闭区域赋予相反权重 在这种设计下 STAR检测器相较于其他尺度空间检测器的优势在于计算效率更高 并且可以在实时性上有更好的表现 相比于SIFT与SURF算法 在子采样采集中提取极值点时 由于缺乏更高分辨率的空间信息 STAR检测器依然能够提供较为精确的大规模尺度特征向量 因此官方指南推荐优先采用STAR特征检测算法

BRIEF特征描述算法的主要步骤如下:

将图像应用高斯模糊滤波器以减少噪声干扰的影响;基于每个像素的具体数值计算的BRIEF算法因而对于噪声非常敏感。

2、对于每个特征单元作为中心基准象素,在其周围构建一个大小为S×S的局部领域(例如9×9),随后在该领域内采用随机抽样方法提取多个候选区域,并通过预设的概率分布模型从候选区域中随机选择两个代表元形成一个对比对[p, q];
若p处象素强度大于q处,则赋值结果r置为1;反之若p处强度小于q处,则赋值结果r置为0;
研究数据显示,在所选取两组对比单元均服从[ 0, (1 / 25) * S^2 ]区间内的高斯分布情况下可获得较优的结果表现;

3、通过反复执行步骤2 N次的方式生成一个N位长的二进制编码序列。通常情况下建议重复该操作过程共256次以生成一个长度为256位的二进制编码序列这即形成了该特征点对应的二进制描述子

BRIEF算法的优势在于其利用二进制编码生成特征向量,并仅通过对比像素灰度值来减少计算量,在此基础之上实现了高效的运算速度。然而由于该算法直接依赖于图像像素的具体数值这一特点,在面对噪声干扰时表现出较差的鲁棒性,并且缺乏旋转不变性和尺度不变性的特性,在实际应用中稳定性有待提升

如果今天整理对FAST特征提取算法与BRIEF特征描述算法进行融合集成,则可以完成图像上的简单目标检测及目标匹配操作。下次的笔记中就让我们系统梳理一下基于上述两种基础算法优化改进后的高效特征提取与描述技术——ORB算法吧。那么今天的笔记内容到这里就结束了,请各位读者批评指正~

PS:我的笔记内容较为丰富,在整理过程中将个人学习心得与网络资源中的相关知识进行了综合汇总。如有重复出现,请理解为仅为表达对前辈学习精神的认可。如若发现我的笔记涉及侵权行为,请及时联系我我会采取相应措施删除相关信息。

全部评论 (0)

还没有任何评论哟~