BRISK特征提取算法

简介

BRISK算法是2011年ICCV上《BRISK:Binary Robust Invariant Scalable Keypoints》文章中,提出来的一种特征提取算法,也是一种二进制的特征描述算子。

它具有较好的旋转不变性、尺度不变性,较好的鲁棒性。在图像配准应用中,速度比较:SIFT>SURF>BRISK>FREAK>ORB,在对有较大模糊的图像配准时,BRISK算法在其中表现最为出色。

BRISK算法

特征点检测

BRISK算法主要利用FAST9-16进行特征点检测(为什么是主要?因为用到一次FAST5-8),可参见博客:FAST特征点检测算法。要解决尺度不变性,就必须在尺度空间进行特征点检测,于是BRISK算法中构造了图像金字塔进行多尺度表达。

建立尺度空间

构造n个octave层(用ci表示)和n个intra-octave层(用di表示),文章中n=4,i={0,1,...,n-1}。假设有图像img,octave层的产生:c0层就是img原图像,c1层是c0层的2倍下采样,c2层是c1层的2倍下采样,以此类推。intra-octave层的产生:d0层是img的1.5倍下采样,d2层是d1层的2倍下采样(即img的2*1.5倍下采样),d3层是d2层的2倍下采样,以此类推。

则ci、di层与原图像的尺度关系用t表示为:

ci、di层与原图像大小关系为:

由于n=4,所以一共可以得到8张图,octave层之间尺度(缩放因子)是2倍关系,intra-octave层之间尺度(缩放因子)也是2倍关系。

特征点检测

对这8张图进行FAST9-16角点检测,得到具有角点信息的8张图,对原图像img进行一次FAST5-8角点检测(当做d(-1)层,虚拟层),总共会得到9幅有角点信息的图像。

非极大值抑制

对这9幅图像,进行空间上的非极大值抑制(同SIFT算法 的非极大值抑制):特征点在位置空间(8邻域点)和尺度空间(上下层2x9个点),共26个邻域点的FAST的得分值要是最大,否则不能当做特征点;此时得到的极值点还比较粗糙,需要进一步精确定位。

亚像素插值

进过上面步骤,得到了图像特征点的位置和尺度,在极值点所在层及其上下层所对应的位置,对FAST得分值(共3个)进行二维二次函数插值(x、y方向),得到真正意义上的得分极值点及其精确的坐标位置(作为特征点位置);再对尺度方向进行一维插值,得到极值点所对应的尺度(作为特征点尺度)。

特征点描述

高斯滤波

现在,我们得到了特征点的位置和尺度(t)后,要对特征点赋予其描述符。为避免降采样引起的混叠效应,以特征点为中心,在其周围采样N个点(包括特征点),采样模式如下图,蓝圈表示;以采样点为中心,为方差进行高斯滤波,滤波半径大小对应方差的大小,红圈表示。最终用到的N个采样点是经过高斯平滑后的采样点。(文章中:N=60)

局部梯度计算

由于有N个采样点,则采样点两两组合成一对,共有N(N-1)/2钟组合方式,所有组合方式的集合称作采样点对,用集合表示,其中像素分别是,δ表示尺度。用表示特征点局部梯度集合,则有:

定义短距离点对子集、长距离点对子集(L个):

其中,,t是特征点所在的尺度。

现在要利用上面得到的信息,来计算特征点的主方向(注意:此处只用到了长距离点对子集),如下:

特征描述符

要解决旋转不变性,则需要对特征点周围的采样区域进行旋转到主方向,旋转后得到新的采样区域,采样模式同上。BRISK描述子是二进制的特征,由采样点集合可得到N(N-1)/2对采样点对,就可以得到N(N-1)/2个距离的集合(包含长、短距离子集),考虑其中短距离子集中的512个短距离点对,进行二进制编码,判断方式如下:

其中,带有上标,表示经过旋转a角度后的,新的采样点。由此可得到,512Bit的二进制编码,也就是64个字节(BRISK64)。

匹配方法

汉明距离进行比较,与其他二进制描述子的匹配方式一样。

实验

opencv代码

#include <cv.h>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/core/core.hpp>
#include <opencv2/nonfree/features2d.hpp>
#include <opencv2/nonfree/nonfree.hpp>
#include <Windows.h>

using namespace cv;
using namespace std;

int main()
{
	//Load Image
	Mat c_src1 =  imread( "1.png");
	Mat c_src2 = imread("2.png");
	Mat src1 = imread( "1.png", CV_LOAD_IMAGE_GRAYSCALE);
	Mat src2 = imread( "2.png", CV_LOAD_IMAGE_GRAYSCALE);
	if( !src1.data || !src2.data )
	{
		cout<< "Error reading images " << std::endl;
		return -1;
	}
	//feature detect
	BRISK detector;
	vector<KeyPoint> kp1, kp2;
	double start = GetTickCount();
	detector.detect( src1, kp1 );
	detector.detect( src2, kp2 );
	//cv::BRISK extractor;
	Mat des1,des2;//descriptor
	detector.compute(src1, kp1, des1);
	detector.compute(src2, kp2, des2);
	Mat res1,res2;
	int drawmode = DrawMatchesFlags::DRAW_RICH_KEYPOINTS;
	drawKeypoints(c_src1, kp1, res1, Scalar::all(-1), drawmode);//画出特征点
	drawKeypoints(c_src2, kp2, res2, Scalar::all(-1), drawmode);
	cout<<"size of description of Img1: "<<kp1.size()<<endl;
	cout<<"size of description of Img2: "<<kp2.size()<<endl;

	BFMatcher matcher(NORM_HAMMING);
	vector<DMatch> matches;
	matcher.match(des1, des2, matches);
	double end = GetTickCount();
	cout<<"耗时:"<<(end - start) <<"ms"<<endl;
	Mat img_match;
	drawMatches(src1, kp1, src2, kp2, matches, img_match);
	cout<<"number of matched points: "<<matches.size()<<endl;
	imshow("matches",img_match);
	cvWaitKey(0);
	cvDestroyAllWindows();
	return 0;
}

实验结果

参考文献

1、BRISK:binary robust invariant scalable keypoints,2011,ICCV.

2、多种角度比较SIFT、SURF、RISK、ORB、FREAK算法[J],2014.

3、基于颜色不变量的特征匹配算法研究[硕士论文],2014.

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-08-05 09:43:25

BRISK特征提取算法的相关文章

FREAK特征提取算法

简介 FREAK算法是2012年CVPR上<FREAK: Fast Retina Keypoint>文章中,提出来的一种特征提取算法,也是一种二进制的特征描述算子. 它与BRISK算法非常相似,个人觉得就是在BRISK算法上的改进,关于BRISK算法详见上一篇博文:BRISK特征提取算法.FREAK依然具有尺度不变性.旋转不变性.对噪声的鲁棒性等. FREAK算法 采样模式 在BRISK算法中,采样模式是均匀采样模式(在同一圆上等间隔的进行采样):FREAK算法中,采样模式发生了改变,它采取了

SIFT,SURF,ORB,FAST 特征提取算法比较

SIFT,SURF,ORB,FAST 特征提取算法比较 主要的特征检测方法有以下几种,在一般的图像处理库中(如opencv, VLFeat, Boofcv等)都会实现. FAST ,Machine Learning for High-speed Corner Detection, 2006 SIFT,Distinctive Image Features from Scale-Invariant Keypoints,2004, invariant to image translation, sca

医学CT图像特征提取算法--肺结节CT图像特征提取算法

摘自本人毕业论文<肺结节CT影像特征提取算法研究> 医学图像特征提取可以认为是基于图像内容提取必要特征,医学图像中需要什么特征基于研究需要,提取合适的特征.相对来说,医学图像特征提取要求更加高,因为对医生的辅助诊断起着至关重要的作用,所以需要严谨可靠的特征.肺结节CT影像特征提取也是属于医学图像特征提取领域的一个部分,有着医学图像特征提取的基本要求.既有其他医学图像特征提取的方法,也有针对肺结节的特定特征提取方法.本小节主要对一些常用的肺结节CT影像医学图像特征提取方法进行介绍,主要可以分为灰

SIFT 特征提取算法总结

原文链接:http://www.cnblogs.com/cfantaisie/archive/2011/06/14/2080917.html   主要步骤 1).尺度空间的生成: 2).检测尺度空间极值点: 3).精确定位极值点: 4).为每个关键点指定方向参数: 5).关键点描述子的生成. L(x,y,σ), σ= 1.6 a good tradeoff     D(x,y,σ), σ= 1.6 a good tradeoff 关于尺度空间的理解说明:图中的2是必须的,尺度空间是连续的.在 

特征提取算法的综合实验(多种角度比较sift/surf/brisk/orb/akze)

一.基本概念: 作用:特征点提取在"目标识别.图像拼接.运动跟踪.图像检索.自动定位"等研究中起着重要作用: 主要算法: ?FAST ,Machine Learning forHigh-speed Corner Detection, 2006 ?SIFT,DistinctiveImageFeatures from Scale-Invariant Keypoints,2004,invariant to image translation, scaling, and rotation, p

SIFT特征提取算法

学到SIFT看到了参考了最下面的四篇文章,最后综合起来,根据自己的理解,按着自己的想法,手敲了下面的内容,感觉好长,不过希望对大家有用. SIFT(Scale-invariant feature transform)是一种检测局部特征的算法,该算法通过求一幅图中的特征点(interest points,or corner points)及其有关scale 和 orientation 的描述子得到特征并进行图像特征点匹配,获得了良好效果. 基本的路线: 1. 尺度空间极值检测:搜索所有尺度上的图像

(5)图像特征提取算法:haar特征

该特征常和AdaBoost结合用于识别人脸.Haar特征很简单,分为三类:边缘特征.线性特征.中心特征和对角线特征,组合成特征模板.特征模板内有白色和黑色两种矩形,并定义该模板的特征值为白色矩形像素和减去黑色矩形像素和.Haar特征值反映了图像的灰度变化情况.例如:脸部的一些特征能由矩形特征简单的描述,如:眼睛要比脸颊颜色要深,鼻梁两侧比鼻梁颜色要深,嘴巴比周围颜色要深等.但矩形特征只对一些简单的图形结构,如边缘.线段较敏感,所以只能描述特定走向(水平.垂直.对角)的结构. Haar的4种特征提

特征提取算法(4)——LoG特征提取算法

目录 1.介绍 2.LoG原理 3.数学原理 4.模板性质 1.介绍 LoG(DoG是一阶边缘提取)是二阶拉普拉斯-高斯边缘提取算法,先高斯滤波然后拉普拉斯边缘提取. Laplace算子对通过图像进行操作实现边缘检测的时,对离散点和噪声比较敏感.于是,首先对图像进行高斯卷积滤波进行降噪处理,再采用Laplace算子进行边缘检测,就可以提高算子对噪声抗干扰能力, 这一个过程中高斯-拉普拉斯(Laplacian of Gaussian(LOG))边缘检测算子就诞生了. 2.LoG原理 底层是二阶微分

特征提取算法(4)——Harris角点提取

1.角点 1.1 特征点与角点 特征点是计算机视觉算法的基础,使用特征点来代表图像的内容. 角点是一类重要的点特征,图像分析的角度来定义: 角点可以是两个边缘的角点: 角点是邻域内具有两个主方向的特征点: 有以下特点: 局部窗口沿各方向移动,均产生明显变化: 图像局部曲率突变: 不同类型的角点: 1.2 典型的角点检测算法 一种需要对图像边缘进行编码,这在很大程度上依赖于图像的分割与边缘提取,具有相当大的难度和计算量,且一旦待检测目标局部发生变化,很可能导致操作的失败. 另一种基于图像灰度的方法