OpenCV3之——基于ORB的多特征融合算法改进

一、原始ORB算法

 1.原始FAST角点检测

 2、原始BRIEF特征点描述子

 

 3、O-FAST 角点检测 

        ORB 的特征点检测部分采用的是 FAST 算子,并在针对其不具备方向性这一缺点进行改进。FAST 算子以其角点提取准确、高效、快速性能,在并行追踪和视频拼接等实时性要求高的场合应用广泛。
 

 

 

4、 R-BRIEF 特征描述 

 

 

 

 

    OpenCV3代码示例:

#include<iostream>
#include<vector>

#include<opencv2/opencv.hpp>
#include<opencv2/highgui/highgui.hpp>
#include<opencv2/features2d/features2d.hpp>
using namespace std;
using namespace cv;

int main() {
	Mat reSize = Mat::zeros(640, 360,CV_8UC3);
	Mat srcImage1 = imread("2222.jpg");
	Mat srcImage2 = imread("1111.jpg");
	resize(srcImage1, srcImage1, reSize.size()*3/4);
	resize(srcImage2, srcImage2, reSize.size());


	//检测SIFT特征点并在图像中提取物体描述符
	//参数定义
	Ptr<ORB> orb = ORB::create();
	vector<KeyPoint> keyPoints1,keyPoints2;
	Mat description1, description2;
	orb->detectAndCompute(srcImage1, Mat(), keyPoints1, description1);
	orb->detectAndCompute(srcImage2, Mat(), keyPoints2, description2);

	//可视化,显示关键点
	Mat ShowKeyPoints1, ShowKeyPoints2;
	drawKeypoints(srcImage1, keyPoints1, ShowKeyPoints1);
	drawKeypoints(srcImage2, keyPoints2, ShowKeyPoints2);
	imshow("Keypoints1", ShowKeyPoints1);
	imshow("Keypoints2", ShowKeyPoints2);

	waitKey(0);

	//Matching
	vector<DMatch> matches;
	Ptr<DescriptorMatcher> matcher = DescriptorMatcher::create("BruteForce");
	matcher->match(description1, description2, matches);

	cout << "find out total " << matches.size() << "matches" << endl;

	//可视化
	Mat ShowMatches;
	drawMatches(srcImage1, keyPoints1, srcImage2, keyPoints2, matches, ShowMatches);
	imshow("matches", ShowMatches);
	waitKey(0);

	return 0;
	
}

 运行结果:

 

 

 二、基于ORB的多特征融合算法改进

         1、简介:图像匹配作为图像处理的关键技术,已成为图像处理的研究热点。广泛应用于人脸识别、文本匹配、目标跟踪、图像拼接、目标识别等领域。SIFT算法[1]是Lowe在1999年正式提出的基于尺度空间的特征点检测方法,在2004年得到改进。SIFT算法在理论上具有完整的尺度不变性,对光照、噪声、旋转、缩放、遮挡、甚至仿射变换具有良好的抗干扰能力,是目前性能最好的算法之一。然而,基于尺度空间极值的特征点检测和基于梯度直方图的特征描述严重限制了SIFT特征提取的计算效率。基于梯度直方图特征描述生成的128维浮点特征向量使得特征匹配花费了大量的时间和内存。针对SIFT算法的不足,Rublee提出了ORB快速旋转匹配算法。ORB算法的效果与SIFT算法相似,计算速度比SIFT算法高出约100倍[2][3]。在特征点检测和描述中,ORB算法使用了快速(来自加速段测试的特征)算法[4]和简单(二进制鲁棒独立基本特征)算法[5][6]。ORB算法充分利用了这两种算法的实时性优势,提高了计算效率。同时,ORB算法对这两种算法进行了改进和优化,获得了旋转不变性和噪声抑制特性。在特征点描述中,ORB算法将特征向量从256字节减少到32字节,大大减少了计算量。在特征匹配中,ORB算法采用了基于二进制编码字符串的汉明距离匹配,比基于128维浮点特征向量的欧氏距离匹配快得多。但是如果直接使用ORB算法进行图像匹配,会出现图像分布不均匀、匹配不匹配程度高、匹配精度差的问题。高斯模糊滤波虽然在一定程度上缓解了这些问题,但会造成图像有用信息的丢失,对结果的准确性造成不利影响。为了提高ORB算法的匹配精度,对ORB算法的步骤进行了改进。在特征点检测中,采用多尺度快速角点检测算法,找出具有尺度不变性的特征点。在特征描述中,提取特征点的闩锁特征[7]和改进的LBP特征[8],将这两个特征串联,形成一个新的二进制闩锁/LBP特征向量。然后,结合重心法,改进的闩锁/LBP特征可以获得较强的鲁棒性。

         2、特征检测:在特征点检测中,ORB算法采用多尺度快速角点检测算法提取特征点。快速角点检测算法的原理是计算选取的像素在其邻域有足够像素的像素值差。当像素值差大于某一阈值时,将所选像素视为特征点。ORB算法使用性能最好的FAST-9算法(半径为9像素)。如图所示,通过选取的像素点和周围的16个像素点[4]计算出16个像素点的差值。如果这16个差值中有9个超过了某个阈值,则认为所选像素点为特征点。

       快速算法对尺度变化敏感,无法获得特征描述所需要的局部区域的主要方向分量。因此,球体采用重心法来测量特征点的方向。重心法假设点的灰度强度与其中心偏移,该向量可用于估算方向[9]。以一个特征点p为中心的patch S的矩定义为:

 其中f(x, y)为点(x, y)的灰度值,p, q确定灰度矩阶。patch S质心C的坐标如下:

ORB构造一个向量OC,从特征点p的中心到质心C。特征点p与质心C连线与横坐标之间的角度定义为快速特征点的方向 :

         3、LATCH 特征描述: 算法在原有的局部二进制描述的基础上,将两个像素点的比较改为三个像素块,从而提高了局部二进制描述符的准确性。首先选取一定尺寸的图像窗口W,检测到的特征点为中心。在检测窗口W中设置有序样本坐标集合如下:

 其中分别为图像窗口W中所选样本点的坐标。

每个像素对齐的二进制结果可以由以下公式得到:

 其中分别为经过高斯滤波后的图像窗口W的采样点, 的值。

根据公式(5),通过比较窗口W中的所有像素对,最终形成特征点的二进制字符串W b,定义如下:

        这种简单的像素值直接比较方法对噪声和图像局部变化非常敏感。针对这一缺陷,将三像素块的比较方法应用到锁存器算法中,在一定程度上解决了噪声的影响,提高了匹配精度。

        首先选取一定尺寸的图像窗口W,检测到的特征点为中心。然后在图像窗口W中定义T样本,每个样本包含三个像素块。窗口中设置的像素块如下:

 其中分别为三个像素块中心点的坐标。

然后计算像素块之间的F范数来评估相似度。二进制串中对应位的值由下式确定:

 其中是主要的像素块,是它的伴随像素块。

根据式(8),通过对窗口W中的三个像素块样本进行比较,最终形成特征点的二进制字符串W b,定义如下:

 4、LBP 特征描述:LBP特征描述是描述纹理特征的一种有效方法,可用于测量和提取局部相邻区域的纹理信息。近几十年来,LBP特征描述[8]在纹理分类、图像检索、人脸图像分析等领域得到了广泛的应用。原始LBP算法的原理如图2所示。首先,在图像的每个像素周围定义一个3x3的局部图像窗口。然后将局部图像窗口中每个像素的灰度值与中心像素的灰度值进行比较。如果像素的灰度值小于中心像素的灰度值,则对应的位置为0,反之为1。图像中的每个像素都可以得到一个二进制编码字符串,并将二进制编码字符串转换为十进制数,那么十进制数就是像素的LBP码。图像中所有像素的LBP代码的直方图作为图像的LBP特征。

 

                                                                                      纠注:顺时针读出bit:

 LBP特征描述符的定义定义如下:

 其中N R分别是当地的像素数量和大小的地方形象窗口,N t是当地图像像素的灰度值,c t是中心像素的灰度值,s(x)是灰度值的函数,量化本地图像像素与中心像素之间的关系。

 

改进的LBP(局部二进制模式)算法:与传统的特征描述算法相比,LBP特征描述算法具有特征提取准确、光照精细、不变性等优点。但也存在一些不足,LBP特征对图像中的噪声太敏感。为了解决这一问题,本文采用图像块的方法,用图像块代替像素生成LBP特征描述。

在生成闩锁特征描述符时,我们使用48*48像素大小的特征点邻域窗口,所以我们也使用48*48像素大小的图像窗口来生成特征点的LBP描述符。如图3所示,围绕feature point的48*48像素大小的图像窗口被划分为4*4个主块,每个主块大小为12*12像素。然后将每个主块进一步划分为3*3个二级块,每个二级块大小为4*4像素。以尽量减少对噪音的敏感性,LBP特征描述是用二次块而不是像素点生成的。首先计算每个次要块的灰度均值,然后根据次要块的灰度均值计算每个主要块的LBP特征描述符。最后,通过对所有主块的LBP描述的串联,形成特征点的改进LBP特征描述符。

5、特征融合: 在特征描述符的生成过程中,采用灰度质心法对特征点周围的固定尺寸图像块进行旋转。然后提取特征点的闩锁描述符和改进的LBP描述符。然后连接锁存器和改进的LBP来生成新的描述符,闩锁/LBP描述符。

         特征融合的过程如图4所示。参考[7]中的闩锁描述采用48*48像素大小提取窗口和7*7像素大小块。尺寸的选择兼顾了计算和精度。闩锁描述是一个256位的二进制字符串。在特征点周围的48*48像素大小的邻域窗口中,根据每个次要块的灰度均值,我们可以将每个主要块的LBP特征计算为8位二进制字符串。然后,将特征点邻域窗口中的所有8位二进制字符串串联起来,形成一个新的128位二进制字符串,作为特征点的改进LBP特征。在特征融合中,256位闩锁特征和128位改进的LBP特征串联起来,生成一个新的384位二进制字符串作为特征点的闩锁/LBP描述符。

5、特征匹配:由于本文的描述符是一个二进制字符串,因此可以使用汉明距离来评估描述符的相似性,计算起来非常有效。建立匹配可以理解为将点对分类为匹配或不匹配,这取决于汉明距离[5]的值。利用改进的ORB算法提取两个图像的特征点和描述符,找到两个关键点之间的最短距离和第二最短距离。当两个汉明距离的比值小于0.8,汉明距离小于50时,认为这两个关键点是匹配的。

在前一节中,获得了384位二进制锁存/LBP描述符,假设K1、K2是两个描述符:

两个描述符的相似性用汉明距离是两个描述符的所有位的XOR之和。定义为:

 较小的 D(K1, K2) r代表较高的相似度,较大的D(K1, K2)代表较低的相似度。

6、实验结果与分析:

 

 

 

 

7、总结:多特征融合解决了大误差和高不匹配的问题。首先,在原有的二进制描述的基础上,利用闩锁特征描述将两个像素点的比较改为三个像素块的比较,提高了二进制描述的准确性。其次,通过将图像分割成块,提高了LBP算法的抗噪声能力。最后,利用多特征融合方法,将这两个特征描述符有效地结合起来,生成一个新的特征描述符作为闩锁/LBP描述符。实验结果表明,与基于统计直方图的特征描述方法相比,本文提出的改进ORB算法大大缩短了计算时间。同时,与传统的二进制字符描述方法相比,本文提出的改进ORB算法可以有效提高匹配精度,减少误匹配,从而有效提高原始ORB匹配性能。 

 

三、参考文献:(论文标题)

【1】An Improved ORB Algorithm Based on Multi-feature Fusion

【2】 基于 ORB 算法的双目视觉测量与跟踪研究 
 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

衣带渐宽人憔悴

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值