‘壹’ sift算法是什么
Sift算法是David Lowe于1999年提出的局部特征描述子,并于2004年进行了更深入的发展和完善。Sift特征匹配算法可以处理两幅图像之间发生平移、旋转、仿射变换情况下的匹配问题,具有很强的匹配能力。
这一算法的灵感也十分的直观,人眼观测两张图片是否匹配时会注意到其中的典型区域(特征点部分),如果我们能够实现这一特征点区域提取过程,再对所提取到的区域进行描述就可以实现特征匹配了。
sift算法的应用
SIFT算法目前在军事、工业和民用方面都得到了不同程度的应用,其应用已经渗透了很多领域,典型的应用如下:物体识别;机器人定位与导航;图像拼接;三维建模;手势识别;视频跟踪;笔记鉴定;指纹与人脸识别;犯罪现场特征提取。
‘贰’ SAD算法是什么啊
SAD(Sum of absolute differences)是一种图像匹配算法。
SAD算法的基本流程:
1.构造一个小窗口,类似与卷积核。
2.用窗口覆盖左边的图像,选择出窗口覆盖区域内的所有像素点。
3.同样用窗口覆盖右边的图像并选择出覆盖区域的像素点。
4.左边覆盖区域减去右边覆盖区域,并求出所有像素点差的绝对值的和。
5.移动右边图像的窗口,重复3,4的动作。(这里有个搜索范围,超过这个范围跳出)
6.找到这个范围内SAD值最小的窗口,即找到了左边图像的最佳匹配的像素块。
‘叁’ 如何比较SIFT,SURF,Harris-SIFT图像匹配算法性能
SIFT匹配(Scale-invariant feature transform,尺度不变特征转换)是一种电脑视觉的算法用来侦测与描述影像中的局部性特征,它在空间尺度中寻找极值点,并提取出其位置、尺度、旋转不变量,此算法由 David Lowe 在1999年所发表,2004年完善总结。其应用范围包含物体辨识、机器人地图感知与导航、影像缝合、3D模型建立、手势辨识、影像追踪和动作比对。
局部影像特征的描述与侦测可以帮助辨识物体,SIFT 特征是基于物体上的一些局部外观的兴趣点而与影像的大小和旋转无关。对于光线、噪声、些微视角改变的容忍度也相当高。基于这些特性,它们是高度显着而且相对容易撷取,在母数庞大的特征数据库中,很容易辨识物体而且鲜有误认。使用 SIFT特征描述对于部分物体遮蔽的侦测率也相当高,甚至只需要3个以上的SIFT物体特征就足以计算出位置与方位。在现今的电脑硬件速度下和小型的特征数据库条件下,辨识速度可接近即时运算。SIFT特征的信息量大,适合在海量数据库中快速准确匹配。
2、SIFT特征的主要特点
从理论上说,SIFT是一种相似不变量,即对图像尺度变化和旋转是不变量。然而,由于构造SIFT特征时,在很多细节上进行了特殊处理,使得SIFT对图像的复杂变形和光照变化具有了较强的适应性,同时运算速度比较快,定位精度比较高。如:
在多尺度空间采用DOG算子检测关键点,相比传统的基于LOG算子的检测方法,运算速度大大加快;
关键点的精确定位不仅提高了精度,而且大大提高了关键点的稳定性;
在构造描述子时,以子区域的统计特性,而不是以单个像素作为研究对象,提高了对图像局部变形的适应能力;
‘肆’ 图像匹配的算法
迄今为止,人们已经提出了各种各样的图像匹配算法,但从总体上讲,这些匹配算法可以分成关系结构匹配方法、结合特定理论工具的匹配方法、基于灰度信息的匹配方法、基于亚像元匹配方法、基于内容特征的匹配方法五大类型 基于内容特征的匹配首先提取反映图像重要信息的特征,而后以这些特征为模型进行匹配。局部特征有点、边缘、线条和小的区域,全局特征包括多边形和称为结构的复杂的图像内容描述。特征提取的结果是一个含有特征的表和对图像的描述,每一个特征由一组属性表示,对属性的进一步描述包括边缘的定向和弧度,边与线的长度和曲率,区域的大小等。除了局部特征的属性外,还用这些局部特征之间的关系描述全局特征,这些关系可以是几何关系,例如两个相邻的三角形之间的边,或两个边之间的距离可以是辐射度量关系,例如灰度值差别,或两个相邻区域之间的灰度值方差或拓扑关系,例如一个特征受限于另一个特征。人们一般提到的基于特征的匹配绝大多数都是指基于点、线和边缘的局部特征匹配,而具有全局特征的匹配实质上是我们上面提到的关系结构匹配方法。特征是图像内容最抽象的描述,与基于灰度的匹配方法比,特相对于几何图像和辐射影响来说更不易变化,但特征提取方法的计算代价通常较,并且需要一些自由参数和事先按照经验选取的闭值,因而不便于实时应用同时,在纹理较少的图像区域提取的特征的密度通常比较稀少,使局部特征的提 取比较困难。另外,基于特征的匹配方法的相似性度量也比较复杂,往往要以特征属性、启发式方法及闭方法的结合来确定度量方法。基于图像特征的匹配方法可以克服利用图像灰度信息进行匹配的缺点,由于图像的特征点比象素点要少很多,因而可以大大减少匹配过程的计算量同时,特征点的匹配度量值对位置的变化比较敏感,可以大大提高匹配的精确程度而且,特征点的提取过程可以减少噪声的影响,对灰度变化,图像形变以及遮挡等都有较好的适应能力。所以基于图像特征的匹配在实际中的应用越来越广-泛。所使用的特征基元有点特征明显点、角点、边缘点等、边缘线段等。
‘伍’ opencv 图像旋转后的匹配怎么做
如果是基于特征点对图像进行匹配的话,建议选用带有方向信息的特征提取算法,这样每一个特征点在提取特征的时候都会计算出一个主方向,这个主方向与图像的旋转无关,而是与特征点周围像素的梯度相关,这样在处理旋转图像时就不必再考虑图像的旋转方向了。
‘陆’ opencv 图像旋转后的匹配怎么做
代码: //OpenCV 图像任意角度旋转 //需要inter公司OpenCV支持. //OpenCV图像任意角度旋转 //待旋转图像IplImage* Img_old //返旋转图像 IplImage* Img_tmp. //旋转角度,单位度. //三种同.其二没完全测试,满足部需要 //Vastsky - Nercita 二005 陆 一二 //vastsky_sun#一二陆中国 IplImage * CCropMeasureView::FitRotate (IplImage* Img_old, double angle,int method) { IplImage* Img_tmp = NULL; double anglerad = (CV_PI* (angle/一吧0)) ; int newheight =int (fabs(( sin(anglerad)*Img_old->width )) + fabs(( cos(anglerad)*Img_old->height )) ); int newwidth =int (fabs(( sin(anglerad)*Img_old->height)) + fabs(( cos(anglerad)*Img_old->width)) ); Img_tmp = cvCreateImage(cvSize(newwidth,newheight), IPL_DEPTH_吧U, 三); cvFillImage(Img_tmp,0);//目图像 使用扩展 IplImage* dst = cvCloneImage( Img_old );//目图像 与原图像等 float m[陆]; CvMat M = cvMat( 二, 三, CV_三二F, m ); if(一==method) { // 提取象素四边形使用象素精度 int w = Img_old->width; int h = Img_old->height; m[0] = (float)(cos(angle*CV_PI/一吧0.)); m[一] = (float)(sin(angle*CV_PI/一吧0.)); m[二] = w*0.5f; m[三] = -m[一]; m[四] = m[0]; m[5] = h*0.5f; cvGetQuadrangleSubPix( Img_old, dst, &M, 一, cvScalarAll(0)); cvGetQuadrangleSubPix( Img_old, Img_tmp, &M, CV_INTER_LINEAR, cvScalarAll(0));//+CV_WARP_FILL_OUTLIERS // 提取象素四边形使用象素精度 } if(二==method) { //二 使用 二维旋转仿射变换矩阵 存问题 要求输入输图像 旋转 CvPoint二D三二f center; center.x=float (Img_old->width/二.0+0.5);//float (Img_tmp->width/二.0+0.5); center.y=float (Img_old->height/二.0+0.5);//float (Img_tmp->height/二.0+0.5); cv二DRotationMatrix( center, angle,一, &M); cvWarpAffine( Img_old, dst, &M,CV_INTER_LINEAR,cvScalarAll(0) );//图 //目标图像 //图像进行扩展 // 能定角度内 同象限同待 int dx=int((newwidth -Img_old->width )/二+0.5); int dy=int((newheight-Img_old->height)/二+0.5); uchar* old_ptr,*temp_ptr; for( int y=0 ; yheight; y++) //越界 { for (int x=0 ; x Img_old->width; x++) { old_ptr = &((uchar*)(Img_old->imageData + Img_old->widthStep*y))[(x)*三]; temp_ptr = &((uchar*)(Img_tmp->imageData + Img_tmp->widthStep*(y+dy)))[(x+dx)*三]; temp_ptr[0]=old_ptr[0]; //green temp_ptr[一]=old_ptr[一]; //blue temp_ptr[二]=old_ptr[二]; //Red } } center.x=float (Img_tmp->width/二.0+0.5); center.y=float (Img_tmp->height/二.0+0.5); cv二DRotationMatrix( center, angle,一, &M); IplImage* temp = cvCloneImage( Img_tmp );//输图像 cvWarpAffine( Img_tmp, temp , &M,CV_INTER_LINEAR+CV_WARP_FILL_OUTLIERS,cvScalarAll(0) );//图 Img_tmp=cvCloneImage( temp ); //问题 //cvWarpAffine( Img_tmp, Img_tmp, &M,CV_INTER_LINEAR+CV_WARP_FILL_OUTLIERS,cvScalarAll(0) );//