java指纹识别的精确算法——SIFT算法

Sift特征点的提取方法,这里简单做个介绍。

     作为一种匹配能力较强的局部描述算子,SIFT算法的实现相当复杂,但从软件开发的角度来说,只要会使用其中几个比较重要的函数就行了。这里要感谢David Lowe这个大牛,不但提供了一种强悍的特征匹配算法,还给出了C++的实现代码,后来有人用C#实现了这个算法,需要的朋友可到网上自行下载。
       
     关键函数一:

     int sift_features( IplImage* img, struct feature** feat )

     这个函数就是用来提取图像中的特征向量。参数img为一个指向IplImage数据类型的指针,用来表示需要进行特征提取的图像。IplImage是opencv库定义的图像基本类型(关于opencv是一个著名的图像处理类库,详细的介绍可以参见http://www.opencv.org.cn)。参数feat 是一个数组指针,用来存储图像的特征向量。函数调用成功将返回特征向量的数目,否则返回-1.

 

     关键函数二:

     int _sift_features( IplImage* img, struct feature** feat, int intvls,double sigma, double contr_thr, int curv_thr, int img_dbl, int descr_width, int descr_hist_bins )

     这个函数是函数一的重载,作用是一样的,实际上函数一只不过是使用默认参数调用了函数二,核心的代码都是在函数二中实现的。下面将详细介绍一下其他的几个参数。

     intvls: 每个尺度空间的采样间隔数,默认值为3.

     sigma: 高斯平滑的数量,默认值1.6.

     contr_thr:判定特征点是否稳定,取值(0,1),默认为0.04,这个值越大,被剔除的特征点就越多。

     curv_thr:判定特征点是否边缘点,默认为6.

     img_dbl:在建立尺度空间前如果图像被放大了1倍则取值为1,否则为0.

     descr_width:计算特征描述符时邻域子块的宽度,默认为4.

     descr_hist_bins:计算特征描述符时将特征点邻域进行投影的方向数,默认为8,分别是0,45,90,135,180,215,270,315共8个方向。


Sift特征匹配算法主要包括两个阶段,一个是Sift特征的生成,即从多幅图像中提取对尺度缩放、旋转、亮度变化无关的特征向量;第二阶段是Sift特征向量的匹配。

     Sift特征的生成一般包括以下几个步骤:

     1、构建尺度空间,检测极值点,获得尺度不变性;

                 SIFT算法学习小记  

     2、特征点过滤并进行精确定位;

                 SIFT算法学习小记  

     3、为特征点分配方向值;

                 SIFT算法学习小记

     4、生成特征描述子。

    以特征点为中心取16*16的邻域作为采样窗口,将采样点与特征点的相对方向通过高斯加权后归入包含8个bin的方向直方图,最后获得4*4*8的128维特征描述子。示意图如下:

                 SIFT算法学习小记

 

    当两幅图像的Sift特征向量生成以后,下一步就可以采用关键点特征向量的欧式距离来作为两幅图像中关键点的相似性判定度量。取图1的某个关键点,通过遍历找到图像2中的距离最近的两个关键点。在这两个关键点中,如果次近距离除以最近距离小于某个阙值,则判定为一对匹配点。



posted @ 2012-04-20 17:23  hibernate3例子  阅读(583)  评论(0编辑  收藏  举报