2018-11-22 10:16:28 weixin_43046653 阅读数 362

图像处理中常用的特征有哪些?

在物体识别、计数的过程中,通常要将人为观察到的特征用于分割目标图像,常用的图像特征可归结为:

  • 颜色特征
  • 纹理特征
  • 形状特征
  • *空间关系特征

##颜色特征

颜色特征是一种全局特征,描述了图像或图像区域所对应的景物的表面性质。一般颜色特征是基于像素点的特征,此时所有属于图像或图像区域的像素都有各自的贡献。由于颜色对图像或图像区域的方向、大小等变化不敏感,所以颜色特征不能很好地捕捉图像中对象的局部特征。另外,仅使用颜色特征查询时,如果数据库很大,常会将许多不需要的图像也检索出来。颜色直方图是最常用的表达颜色特征的方法,其优点是不受图像旋转和平移变化的影响,进一步借助归一化还可不受图像尺度变化的影响,基缺点是没有表达出颜色空间分布的信息。

常用的特征提取与匹配方法

(1) 颜色直方图

其优点在于:它能简单描述一幅图像中颜色的全局分布,即不同色彩在整幅图像中所占的比例,特别适用于描述那些难以自动分割的图像和不需要考虑物体空间位置的图像。其缺点在于:它无法描述图像中颜色的局部分布及每种色彩所处的空间位置,即无法描述图像中的某一具体的对象或物体。

最常用的颜色空间:RGB颜色空间、HSV颜色空间。

颜色直方图特征匹配方法:直方图相交法、距离法、中心距法、参考颜色表法、累加颜色直方图法。

(2) 颜色集

颜色直方图法是一种全局颜色特征提取与匹配方法,无法区分局部颜色信息。颜色集是对颜色直方图的一种近似首先将图像从 RGB颜色空间转化成视觉均衡的颜色空间(如 HSV 空间),并将颜色空间量化成若干个柄。然后,用色彩自动分割技术将图像分为若干区域,每个区域用量化颜色空间的某个颜色分量来索引,从而将图像表达为一个二进制的颜色索引集。在图像匹配中,比较不同图像颜色集之间的距离和色彩区域的空间关系

(3) 颜色矩

这种方法的数学基础在于:图像中任何的颜色分布均可以用它的矩来表示。此外,由于颜色分布信息主要集中在低阶矩中,因此,仅采用颜色的一阶矩(mean)、二阶矩(variance)和三阶矩(skewness)就足以表达图像的颜色分布。

(4) 颜色聚合向量

其核心思想是:将属于直方图每一个柄的像素分成两部分,如果该柄内的某些像素所占据的连续区域的面积大于给定的阈值,则该区域内的像素作为聚合像素,否则作为非聚合像素。

(5) 颜色相关图

##纹理特征

(一)特点:纹理特征也是一种全局特征,它也描述了图像或图像区域所对应景物的表面性质。但由于纹理只是一种物体表面的特性,并不能完全反映出物体的本质属性,所以仅仅利用纹理特征是无法获得高层次图像内容的。与颜色特征不同,纹理特征不是基于像素点的特征,它需要在包含多个像素点的区域中进行统计计算。在模式匹配中,这种区域性的特征具有较大的优越性,不会由于局部的偏差而无法匹配成功。作为一种统计特征,纹理特征常具有旋转不变性,并且对于噪声有较强的抵抗能力。但是,纹理特征也有其缺点,一个很明显的缺点是当图像的分辨率变化的时候,所计算出来的纹理可能会有较大偏差。另外,由于有可能受到光照、反射情况的影响,从2-D图像中反映出来的纹理不一定是3-D物体表面真实的纹理。

例如,水中的倒影,光滑的金属面互相反射造成的影响等都会导致纹理的变化。由于这些不是物体本身的特性,因而将纹理信息应用于检索时,有时这些虚假的纹理会对检索造成“误导”。

在检索具有粗细、疏密等方面较大差别的纹理图像时,利用纹理特征是一种有效的方法。但当纹理之间的粗细、疏密等易于分辨的信息之间相差不大的时候,通常的纹理特征很难准确地反映出人的视觉感觉不同的纹理之间的差别。

(二)常用的特征提取与匹配方法

纹理特征描述方法分类

(1)统计方法统计方法的典型代表是一种称为灰度共生矩阵的纹理特征分析方法Gotlieb 和 Kreyszig 等人在研究共生矩阵中各种统计特征基础上,通过实验,得出灰度共生矩阵的四个关键特征:能量、惯量、熵和相关性。统计方法中另一种典型方法,则是从图像的自相关函数(即图像的能量谱函数)提取纹理特征,即通过对图像的能量谱函数的计算,提取纹理的粗细度及方向性等特征参数

(2)几何法

所谓几何法,是建立在纹理基元(基本的纹理元素)理论基础上的一种纹理特征分析方法。纹理基元理论认为,复杂的纹理可以由若干简单的纹理基元以一定的有规律的形式重复排列构成。在几何法中,比较有影响的算法有两种:Voronio 棋盘格特征法和结构法。

(3)模型法

模型法以图像的构造模型为基础,采用模型的参数作为纹理特征。典型的方法是随机场模型法,如马尔可夫(Markov)随机场(MRF)模型法和 Gibbs 随机场模型法

(4)信号处理法

纹理特征的提取与匹配主要有:灰度共生矩阵、Tamura 纹理特征、自回归纹理模型、小波变换等。

灰度共生矩阵特征提取与匹配主要依赖于能量、惯量、熵和相关性四个参数。Tamura 纹理特征基于人类对纹理的视觉感知心理学研究,提出6种属性,即:粗糙度、对比度、方向度、线像度、规整度和粗略度。自回归纹理模型(simultaneous auto-regressive, SAR)是马尔可夫随机场(MRF)模型的一种应用实例。

形状特征

(一)特点:各种基于形状特征的检索方法都可以比较有效地利用图像中感兴趣的目标来进行检索,但它们也有一些共同的问题,包括:①目前基于形状的检索方法还缺乏比较完善的数学模型;②如果目标有变形时检索结果往往不太可靠;③许多形状特征仅描述了目标局部的性质,要全面描述目标常对计算时间和存储量有较高的要求;④许多形状特征所反映的目标形状信息与人的直观感觉不完全一致,或者说,特征空间的相似性与人视觉系统感受到的相似性有差别。另外,从 2-D 图像中表现的 3-D 物体实际上只是物体在空间某一平面的投影,从 2-D 图像中反映出来的形状常不是 3-D 物体真实的形状,由于视点的变化,可能会产生各种失真。

(二)常用的特征提取与匹配方法

Ⅰ几种典型的形状特征描述方法

通常情况下,形状特征有两类表示方法,一类是轮廓特征,另一类是区域特征。图像的轮廓特征主要针对物体的外边界,而图像的区域特征则关系到整个形状区域。

几种典型的形状特征描述方法:

(1)边界特征法该方法通过对边界特征的描述来获取图像的形状参数。其中Hough 变换检测平行直线方法和边界方向直方图方法是经典方法。Hough 变换是利用图像全局特性而将边缘像素连接起来组成区域封闭边界的一种方法,其基本思想是点—线的对偶性;边界方向直方图法首先微分图像求得图像边缘,然后,做出关于边缘大小和方向的直方图,通常的方法是构造图像灰度梯度方向矩阵。

(2)傅里叶形状描述符法

傅里叶形状描述符(Fourier shape descriptors)基本思想是用物体边界的傅里叶变换作为形状描述,利用区域边界的封闭性和周期性,将二维问题转化为一维问题。

由边界点导出三种形状表达,分别是曲率函数、质心距离、复坐标函数。

(3)几何参数法

形状的表达和匹配采用更为简单的区域特征描述方法,例如采用有关形状定量测度(如矩、面积、周长等)的形状参数法(shape factor)。在 QBIC 系统中,便是利用圆度、偏心率、主轴方向和代数不变矩等几何参数,进行基于形状特征的图像检索。

需要说明的是,形状参数的提取,必须以图像处理及图像分割为前提,参数的准确性必然受到分割效果的影响,对分割效果很差的图像,形状参数甚至无法提取。

(4)形状不变矩法

利用目标所占区域的矩作为形状描述参数。

(5)其它方法

近年来,在形状的表示和匹配方面的工作还包括有限元法(Finite Element Method 或 FEM)、旋转函数(Turning Function)和小波描述符(Wavelet Descriptor)等方法。

Ⅱ 基于小波和相对矩的形状特征提取与匹配

该方法先用小波变换模极大值得到多尺度边缘图像,然后计算每一尺度的 7个不变矩,再转化为 10 个相对矩,将所有尺度上的相对矩作为图像特征向量,从而统一了区域和封闭、不封闭结构。

空间关系特征

(一)特点:所谓空间关系,是指图像中分割出来的多个目标之间的相互的空间位置或相对方向关系,这些关系也可分为连接/邻接关系、交叠/重叠关系和包含/包容关系等。通常空间位置信息可以分为两类:相对空间位置信息和绝对空间位置信息。前一种关系强调的是目标之间的相对情况,如上下左右关系等,后一种关系强调的是目标之间的距离大小以及方位。显而易见,由绝对空间位置可推出相对空间位置,但表达相对空间位置信息常比较简单。

空间关系特征的使用可加强对图像内容的描述区分能力,但空间关系特征常对图像或目标的旋转、反转、尺度变化等比较敏感。另外,实际应用中,仅仅利用空间信息往往是不够的,不能有效准确地表达场景信息。为了检索,除使用空间关系特征外,还需要其它特征来配合。

(二)常用的特征提取与匹配方法
提取图像空间关系特征可以有两种方法:一种方法是首先对图像进行自动分割,划分出图像中所包含的对象或颜色区域,然后根据这些区域提取图像特征,并建立索引;另一种方法则简单地将图像均匀地划分为若干规则子块,然后对每个图像子块提取特征,并建立索引。


2017-03-24 15:30:10 qq_21034239 阅读数 1053

在图像处理中常用的特征:

边缘:使用最多的:sobel canny susan


sobel:这个还可以来求梯度方向

void sobel_te(IplImage *img,IplImage * sobel8u)
{
IplImage*  sobel=cvCreateImage( cvGetSize(img), IPL_DEPTH_16S, 1 );
IplImage* sobel_y=cvCreateImage( cvGetSize(img), IPL_DEPTH_16S, 1 );
IplImage* sobel_x=cvCreateImage( cvGetSize(img), IPL_DEPTH_16S, 1 );
cvSobel(img,sobel_y,1,0,3);  //提取Y方向
cvSobel(img,sobel_x,1,0,3);  //提取X方向
cvOr(sobel_x,sobel_y,sobel,NULL);   
cvConvertScaleAbs(sobel,sobel8u,1,0);//把sobel计算后的值由16位转为8位供正常显示 
sobel8u->origin = img->origin;    
}

susan:这是在网上找到的,注意边缘检测后再显示中图像会和正常的不太一样,调用该函数的时候实参nimg,最好cvcloneimg后再做。

void :susan_bianyuan(const IplImage *Img,IplImage * nimg)
{
int height ,width ,step ,channels ;
int i,j,k,same ,max,min,thresh,sum;
uchar*data0,*data1 ;
height = Img->height;
width = Img->width;
step  = Img->widthStep/sizeof(uchar);
channels = Img->nChannels;
data0   = (uchar*)Img->imageData;
data1 =  (uchar*)nimg->imageData;
int OffSetX[37] = { -1, 0, 1,
-2,-1, 0, 1, 2,
-3,-2,-1, 0, 1, 2, 3,
-3,-2,-1, 0, 1, 2, 3,
-3,-2,-1, 0, 1, 2, 3,
-2,-1, 0, 1, 2,
-1, 0, 1 };
int OffSetY[37] = { -3,-3,-3,
-2,-2,-2,-2,-2,
-1,-1,-1,-1,-1,-1,-1,
0, 0, 0, 0, 0, 0, 0,
1, 1, 1, 1, 1, 1, 1,
2, 2, 2, 2, 2,
3, 3, 3 };

max = min = data0[0];
for(i=3;i<height-3;i++)
for(j=3;j<width-3;j++)
{
same =0;sum = 0;
for(k=0;k<37;k++)
{
sum+=data0[(i+OffSetY[k])*step+(j+OffSetX[k])];
thresh = sum/37;
if(abs(data0[(i+OffSetY[k])*step+(j+OffSetX[k])]-data0[i*step+j])<=thresh)
same++;
if(same<30)//30
data1[i*step+j] = 255;
else
data1[i*step+j] = 0;
}
}

}

oid susan_jiaodian(IplImage *src,IplImage *dst)
{


IplImage *pImgGray=NULL;
CvMat *mat_I,*mat_Num,*mat_R,*mat_corner;
int size=7;
pImgGray=cvCreateImage(cvGetSize(src),IPL_DEPTH_8U,1);
::cvCopy(src,pImgGray,0);
const int cxDIB=src->width ;         // 图像宽度
const int cyDIB=src->height;         // 图像高度
double *I=new double[cxDIB*cyDIB];
int i,j;
for(j=0;j<cyDIB;j++)
for(i=0;i<cxDIB;i++)
{
I[j*cxDIB+i]=S(pImgGray,i,j);//将灰度图像数值存入I中
}
mat_I=cvCreateMat(cyDIB,cxDIB,CV_64FC1);
cvInitMatHeader(mat_I,cyDIB,cxDIB,CV_64FC1,I);//用I来初始化相应的矩阵
mat_Num=mbnum(mat_I,cxDIB,cyDIB,size);//用来求得n(r0)
mat_R=mbr(mat_Num,cxDIB,cyDIB,size,1.0);//get the R(r0)
mat_corner=mbcorner(mat_R,cxDIB,cyDIB,size);//get the corner matrix


CvPoint pt;
for(j=size/2;j<cyDIB-size/2;j++)  //ignore the edge pixels from the size/2 to DIB-size/2
for(i=size/2;i<cxDIB-size/2;i++)
{
if(CV_MAT_ELEM(*mat_corner,int,j,i)==255){
pt.x=i;
pt.y=j;
cvCircle(dst,pt,2,CV_RGB(255,0,0),1,8,0); //draw a circl on the src when it is a corner
}
}

cvReleaseImage(&pImgGray);
cvReleaseMat(&mat_I);
cvReleaseMat(&mat_Num);
cvReleaseMat(&mat_R);
cvReleaseMat(&mat_corner);
}


轮廓/hu不变矩:利用opencv中cvFindContours,可以得到hu不变矩

CvSeq*lunkuo(IplImage* src)
{

IplImage* img= cvCreateImage(cvSize(mframe->width,mframe->height),IPL_DEPTH_8U,1);
cvCopy(src,img,0);
         CvMemStorage*storage = cvCreateMemStorage(0);
         CvSeq*contour = 0;
         // 提取轮廓cvFindContours会改变第一个参数img的内容的,所以不想改变,前面用了cvcopy
         intcontour_num = cvFindContours(img, storage, &contour, sizeof(CvContour),CV_RETR_CCOMP, CV_CHAIN_APPROX_SIMPLE);//CV_RETR_CCOMP  
         CvSeq*_contour = contour; 
         doublemaxarea = 0;
         doubleminarea =200;      double len1=0;
         CvMoments*moments1=new CvMoments(); 
         CvHuMoments*huMonents1=new CvHuMoments();

         for(inti=1; contour != 0; contour = contour->h_next,i++ )  
         { 


                   doubletmparea = fabs(cvContourArea(contour));

                   if(tmparea< minarea)   
                   { 
                   cvSeqRemove(contour,0); // 删除面积小于设定值的轮廓
                   continue;
                   }
                   CvRectaRect = cvBoundingRect( contour, 0 ); 
                  
                   if((aRect.width/aRect.height)<1)  
                   { 
                   cvSeqRemove(contour,0); //删除宽高比例小于设定值的轮廓
                   continue;
                   }

                   if(tmparea> maxarea)  
                   { 
                            maxarea= tmparea;
                   } 
                   //创建一个色彩值
                   CvScalarcolor = CV_RGB( 0, 255, 255 );
cvRectangle( temp, cvPoint( aRect.x, aRect.y),cvPoint( aRect.x + aRect.width, aRect.y + aRect.height ),CV_RGB(0,255,255),3,8,0);
                   CvBox2D rect=cvMinAreaRect2 (contour,0)
                   //cout<<"轮廓数:"<<contour_num<<"面积"<<tmparea<<"周长"<<len1<<endl;
                   //轮廓的矩 
                   cvMoments(contour,moments1,0);
                   //Hu矩
                   cvGetHuMoments(moments1,huMonents1);
         } 


         deletemoments1;
         delete huMonents1;

return contour ;

}

Hu不变矩:

是描述图像的几何特征,由于Hu不变矩只用到低阶矩(最多也就用到三阶矩),对于图像的细节未能很好的描述出来。

Zernike矩 

在模式识别中,一个重要的问题是对目标的方向性变化也能进行识别。Zernike 矩是一组正交矩,具有旋转不变性的特性,即旋转目标并不改变其模值。

由于Zernike 矩可以构造任意高阶矩,所以Zernike 矩的识别效果优于其他方法.所以在文献中关于船舶识别的多采用几何矩 Zernike矩,


轮廓匹配:cvMatchShapes

项目中用到:可以将前面得到的轮廓 CvSeq*contour 输入到cvMatchShapes中进行匹配。

IplImage *srcColor = cvLoadImage("E:\\vs上级程序(自己的)\\vs练习\\跟踪程序\\vv\\detect\\ship\\n11\\6.jpg", 1);  
CvSeq * c1=lunkuo(srcColor);
int i;  
stringstream ss;  
string path;  
string str;  
IplImage *dst = NULL, *dstColor;  
char c[256];  
double result, maxResult= 1000 * 256 *256;  
IplImage *resultMap = NULL;  
for (i =1; i <=6; i ++)  
{  
path = "E:\\n11\\";  
ss.clear();  
ss << i;  
ss >> str;  
str += ".jpg";  
path += str;  
ss.clear();  
ss << path;  
ss >> c;  
dstColor = cvLoadImage(c,1);  
if(dstColor){
CvSeq * c2=lunkuo(dstColor);
result = cvMatchShapes(c1, c2, 3);  
cout<<result<<endl;
if(result <Minresult)  
{  
resultMap = cvCreateImage(cvGetSize(dstColor), 8, 3);  
MinResult = result;  
cvCopy(dstColor, resultMap,0);  
}  
}
}  

 直线:

void find_lines(IplImage* src,IplImage* dst)
{

CvMemStorage* storage = cvCreateMemStorage(0);  
CvSeq* lines = 0;  
lines = cvHoughLines2( src, storage, CV_HOUGH_PROBABILISTIC, 6, CV_PI/180, 50, 50, 10 );
int num_lines=0;
//printf("直线个数:",lines->total);
for(int i = 0; i < lines->total; i++ )
{
CvPoint* line = (CvPoint*)cvGetSeqElem(lines,i);
float rho = line[0].x;
float theta = line[1].y;
float result=(line[0].x-line[1].x)*(line[0].x-line[1].x)+(line[0].y-line[1].y)*(line[0].y-line[1].y);
if(result>100){
//printf("%f\n",result);
cvLine( dst, line[0], line[1], CV_RGB(255,0,0),6, CV_AA, 0 );
}
}
cvReleaseMemStorage(&storage);

}

纹理特征:

灰度共生矩阵,LBP (局部二值模式),LTP(局部三值模式)在做跟踪的时候很多文献将LBP.LTP加入到Meanshift算法中。灰度共生矩阵在识别中多采用


     

2019-07-17 21:32:08 xiao_lxl 阅读数 456

本篇主要是基于之前的一篇文章的整理,整理成思维导图模式,方便查看和复习。

常用的图像特征——颜色特征、纹理特征、形状特征、空间关系特征

主要是从图像的颜色特征,纹理特征,形状特征,空间特征展开讨论,主题框架如下图所示:
在这里插入图片描述
完整的思维导图为:
在这里插入图片描述

有需要思维导图源文件的博友,可留言联系。

2018-12-03 15:18:21 sinat_31184961 阅读数 185

这边主要记录一下图像处理中使用的特征,包括全局特征:直方图;局部特征:Harris角点,SURF,SIFT等

一、全局特征

1、常用的特征

  • 颜色直方图
  • 颜色矩(Color Moments)
  • 方向梯度直方图
  • VLAD :globalized local feature(全局化的局部特征)

颜色直方图

颜色直方图就是把像素值0-255分成多个bin,计算落在每个bin上的像素值的个数即可。
在这里插入图片描述
对于灰度图只要算一次,对于彩色图像,对每个通道做一次。

在这里插入图片描述

如上图:

  • 对于彩色的lena一种生成三个直方图,R、G、B三个通道;
  • 是颜色分布的数据表示
  • 当然两张完全不一样的图片可能会有一样的颜色分布;
  • 也就是说颜色梯度直方图没有那么具有区分度。

Matlab代码:

img1 = imread('lena.jpg');
r1  =im2double(img1(:,:,1))*256;
hr = hist(reshape(r1,[256*256,1]),32);
g1 = im2double(img1(:,:,2))*256;
hg = hist(reshape(g1,[256*256,1]),32);
b1 = im2double(img1(:,:,3))*256;
hb = hist(reshape(b1,[256*256,1]),32);
hist = [hr;hg;hb];
bar(hist)
 

结果图如下:
在这里插入图片描述

颜色空间

一张图片可以用各种颜色空间表示,如RGB、HSV、Lab等

颜色矩(color Moment)

  • 强度值分布(在一个通道上)被看作是一个统计变量
  • 我们可以计算它的矩(通常称为中心矩)
  • 可以用下面这个公式表示:
    在这里插入图片描述
  • 连接的时刻和来自不同块的时刻被串联起来;
  • 这很简单,但相当成功。

HOG:方向梯度直方图

在这里插入图片描述
计算图片的颜色梯度值,梯度是一个向量,里面有向量的方向(orientation)和长度(magnitude):
在这里插入图片描述
在这里插入图片描述在这里插入图片描述

其实就是x方向和y方向上的偏导数,下面我们来讲一下如何求这个偏导数,我们可以把图片看成是一个函数f(x,y),当求导的时候dx = dy = 1,结果如下:

I(x,y)x=I(x,y)I(x1,y)\frac{\partial I(x,y)}{\partial x} = I(x,y) - I(x-1,y)

二阶导可以这么算:
2I(x,y)x2=[I(x+1,y)I(x,y)][I(x,y)I(x1,y)]=[I(x+1,y)+I(x1,y)]2I(x,y)\frac{\partial^2 I(x,y)}{\partial x^2} = [I(x+1,y) - I(x,y)] - [I(x,y) - I(x-1,y)] = [I(x+1,y) + I(x-1,y)] - 2* I(x,y)

全局特征对比

在这里插入图片描述

二、局部特征

在局部特征中,图片的的边缘比内部重要,而角点又比边缘重要,所以很多方法在处理图像时提取的都是边界或者是角点的信息。

1、Harris角点

原理:
在这里插入图片描述
如上图,在a中,无论我向哪个方向移动,这个方框里的东西都会有变化,但是b和c有一个方向,我们只要沿着那个方向移动,这个片里面的东西是不变的,我们只需要对图片中每个边缘做一个方框移动操作,就能精确找到角点。
在这里插入图片描述

匹配每个能量的变化,w是刚刚说的方框,u和v是x和y的偏移。(具体公式推导请自行百度)

每个点的值为:
在这里插入图片描述
学习一个M,当一个点两个方向的特征值都很大的时候,认为这个点是一个角点:
在这里插入图片描述
在这里插入图片描述

对每个点计算出其Harris值后,利用非极大值抑制来选择局部最优的点

== Harris角点是在X-Y空间中计算的 ==
在这里插入图片描述
如上图,现在我们得到了角点,但是在做图像匹配的时候,我们一般都是使用点和其周围的局部特征,那么对于这个局部的大小应该怎么确定呢?

2、尺度不变特征

我们知道,对于一张图,可能会有许多不同的尺度,所以为了要使得得到的特征是尺度不变的,我们需要对不同尺度的图应用不同的局部区域半径。这里我们拿到一张图后,先对他进行不同高斯核的平滑操作,就会得到一系列的图,这些图其实我们可以认为就是不同尺度的。如下:
在这里插入图片描述

一开始我们在X-Y平面上做最大值选择,现在我们在该图的上下两个σ\sigma上选最大值,选到的最大值我们就认为它是尺度不变的,因为它无论是在自己平面上还是金字塔上都是最大的。
在这里插入图片描述

那我们的目标就是找到一个函数表示,使得我们总能在某一个σ\sigma处找到极值。这个函数拥有的峰值越少越好。
在这里插入图片描述

不幸的是,刚刚提到的Harris对于尺度变化是敏感的,而LOG是一个性能比较好的函数表示。LoG公式如下:
在这里插入图片描述

后来人们发现DOG是LOG的一个近似计算,而且DOG比LOG好计算很多,实际上这两个都被广泛应用。

尺度不变特征计算流程

1、在进行了不同σs\sigma s高斯平滑图片上求Harris角点;(这里可以看下图,对一个尺度的图片,一共做了三次平滑,然后再在这三个平面内找用LOG找Harris点)
2、对于相同的σs\sigma s建立LOG金字塔;
3、选择特征点,使得该特征点在Harris平面和LOG空间里都最大。
在这里插入图片描述

在这里插入图片描述

左边图是有圈的,这个圈就代表我们找到的局部区域,也就是我们在哪个σ\sigma上得到最大值,这个σ\sigma就作为圈的半径。

Hessian矩阵

在尺度不变特征中,Hessian是一种被广泛应用的特征:在SURF中被应用
在这里插入图片描述

Hessian矩阵作者提出来的时候还使用了积分图来加快计算速度。Hessian在做的时候也是一开始使用不同半径的高斯函数作用在原图上得到一个金字塔,然后再对图像求偏导。这边使用了一个trick,就是先在高斯核上求偏导,然后再做卷积,得到的结果是一样的。
在这里插入图片描述

对于给定的高斯核,他们直接把它二值化:
在这里插入图片描述
此时Hessian矩阵的行列式值近似为:

Det(H)DxxDyy0.9Dxy2Det(H) \approx D_{xx}*D_{yy} - 0.9*D_{xy}^2

积分图计算如下:
在这里插入图片描述

也就是每个格子的值等于其左上角区域的值累加。

  • 积分图比原图大一行一列;
  • 积分图是为了加快卷积操作;
  • 使用积分图比Hessian快五倍;
  • 比DoG快三倍;
  • blocks分的越大,速度提升越显著

3、旋转不变特征

在这里插入图片描述
如上图,图像旋转了,但我们还是希望能得到正确的匹配。那如何解决这个问题呢,David等人提出的SIFT特征就能解决这个事情。
SIFT特征可以总结如下:

  • 对局部建立一个梯度直方图;
  • 把密度最高的那个方向作为这个局部区域的主方向;
  • 将这个局部区域旋转到这个主方向;
  • 通过不同旋转操作的各个区域现在看起来是一样的。

在这里插入图片描述

对于每个patch都计算自己的主方向。
Matlab代码:

clear;
img = imread('lena.jpg');
img1 = im2double(img(:,:,1))*256;
figure(1);
imshow(img);
sz = size(img1);
[dx,dy] = gradient(img1);
[X,Y] = meshgrid(1:1:sz(1),1:1:sz(1));
Y = flipud(Y);
figure(2);
quiver(X,Y,dx,dy,'LineWidth',1.9);
orient = atan2(dy,dx)+pi;
figure(3);
r = reshape(orient,[256*256,1]);
h =  hist(reshape(orient,[256*256,1]),32);
bar(h)

对于lena结果如下:
在这里插入图片描述

值得注意的是,SIFT在将方向叠加时,并不是所有的方向都能准确落到一个bin上,所以需要对他进行分割叠加到最近的两个bin上,本文后面一些会仔细讲一个这个部分。

4、仿射变换不变性

仿射变换是由于拍照是视角不一样导致的。如下:
在这里插入图片描述
我们需要将不同形状和方向的椭圆归一化成半径一样的圆。

在这里插入图片描述

我们可以认为圆经过一系列的仿射变换后变成了椭圆区域。

仿射变换可以用Harris或者Hessian矩阵估计,主要流程:
在这里插入图片描述

  • 初始化T=E
  • 计算矩阵M=H(x,y,σ)M = H(x,y,\sigma)
  • 使用M1M^{-1}来归一化(x,y)周围的区域;
  • 检查e1e21\frac{e_1}{e_2}\approx 1
  • T=TM1T = T*M^{-1}
  • 转到第二步,直到e1e2\frac{e_1}{e_2}接近1

在这里插入图片描述

上图对于一张图片只选30个点,椭圆区域由Hessian矩阵估计,这样我们可以得到对应的椭圆区域。
在这里插入图片描述

5、翻转不变性(镜像不变)

在这里插入图片描述

SIFT对翻转操作是敏感的,所以当图片镜像后就匹配不出来了。
但是我们如何判断一个图片是否进行了翻转操作,这里提出了一个环形的方向梯度:

环形防线梯度定义:对于每个点的梯度,分解为圆心与这个点连接方向和垂直这个线方向的两个分量,然后将整张图所有切线方向的值直接累加,会得到一个值,若大于0我们认为是顺时针,小于0则是逆时针。如下图,若图像发生翻转变换时,m方向会相反,这里我们只需要计算出这个patch的环形方向梯度,若大于0则不变,若小于0则翻转。这是赵万磊老师提出的方法,感兴趣的可以去他的主页找这个论文。
在这里插入图片描述

6、SIFT特征点

SIFT特征提出后,被广泛应用在各个领域,后来一些任务上被深度特征代替,但是在图像拼接的应用还是使用的SIFT特征点。

预处理:

  • 将图片归一化成2d2d2d *2d
  • 计算每个patch的梯度

SIFT生成

  • 将一个patch又分成4*4的网格;
  • 对于每个格计算梯度直方图,这里直方图分成8个bin;
  • 然后将16个格的直方图连接起来,得到一个8448*4*4维的向量,这就是SIFT特征向量

在这里插入图片描述
当然我们一开始拿到的图片尺寸都是不一样的,所以还是需要对patch进行归一化操作,归一化操作如上。假设我们的归一化后的图T尺度是404040*40,这是我们的一个目标X是101010*10,这个时候我们在T上循环,在X上找能对上的值就可以了,这样可以保证T中每个点都有值。

在这里插入图片描述

说一下之前提到的每个点的方向不会都正好落在一个bin上,这个时候假设这个点的梯度方向为θ\theta它的值介于θi\theta_iθi+1\theta_{i+1}之间,这个点在θi\theta_i上的权重w由一下公式算出:
w=1θθiπ4w =1 - \frac{|\theta - \theta_i|}{\frac{\pi}{4}}
权重与这个点与bin的距离成反比,然后再把这个点的向量长度按权重分成两份,分别分给两个bin就可以了。
在这里插入图片描述

SIFT的一些应用

目标检测
在这里插入图片描述

SIFT的不足

1、没办法区分不同的纹理
在这里插入图片描述
2、只能匹配局部特征,没有全局效果,没有语义信息
在这里插入图片描述在这里插入图片描述
一些参考网站。

2015-12-25 12:16:41 samkieth 阅读数 2168
传统的图像拼接算法主要分为基于像素点和基于特征两种。基于像素的算法是在一幅图像中选取一个模板,根据评价函数在另一幅图像中寻找与之最相似的点或区域。该算法对图像
中存在大量相似区域且重叠部分较小的情况, 模板块选取的随机性会使拼接出现很大误差. 基于特征的算法是提取两幅图像重叠区域的特征点,对特征点进行匹配,然后计算从一幅图像到另一幅图像的变换。常用的特征主要包括点、线、面等,其中特征点的方法计算量最小,拼接速度快,抗干扰能力较强。基于特征的方法虽然计算量较小, 但图像的点特征和线特征的提取与场景的复杂度相关,反而不便实现。而且两幅相似的图片极易产生

伪匹配的对应特征,且难以被发现,导致图像拼接的失败。在进行图像匹配时,人们最常用的就是模板匹配法,因为模板匹配的穷尽搜索法是最直接和最容易实现的方法, 而且一般与所拼接的图像内容无关。虽然模板匹配有计算量比较大、准确率不太高等缺点, 但是在目前的图像拼接领域研究中仍然广泛采用。

根据以上分析, 本文在基于像素和特征的图像拼接方法基础上, 提出一种基于特征提取和模板匹配相结合的图像拼接新算法。算法的基本思想是:先对两幅相邻图像进行特征点提取,然后根据特征点的位置在第一副图像确定模板块的大小, 在第二幅图像确定搜索范围,然后进行匹配计算,完成图像拼接。



图像特征包括像素灰度特征、色彩特征、区域特征、纹理特征、轮廓特征、边缘特征、角点特征等。边缘特征和角点特征是两种较常用的特征。

图像处理之Haar特征

阅读数 13173

没有更多推荐了,返回首页