图像处理--角点检测(Harris以及其他算法研究)

环境:Windows xp+MATLAB 2010b

提及角点检测,就不能忘了最经典的Harris角点检测算法,下面就主要介绍下Harris算法及其matlab实现。

 

算法介绍:

1)通常情况下,可以将区域内的点分为3类,a.平坦的点,b.边缘上的点,c.角点。

2)若对于这3类点分别求取Ix,Iy,很显然,a类点的Ix和Iy都很小,b类点则是Ix和Iy有一个稍大一个稍小,而角点c则是两个值都很大。所以根据这种性质,可以区分出角点来。

求解Ix,Iy的过程说明:

利用单方向上(横轴&纵轴),点与周围点的差分来计算,有两种方法,

一是,取3x3邻域计算,通常取

Ix子模板:          Iy子模板:

-1 0 1            -1 -1 -1

-1 0 1             0  0  0

-1 0 1             1  1  1

先对图像矩阵上每一点分别求取其Ix,Iy乘积后叠加的值,记为Ix(m,n),Iy(m,n).(其中,m,n分别为原矩阵的大小)

二是,直接只采用横轴和纵轴上的点计算差分。

% fx = [-1 0 1;-1 0 1;-1 0 1];          % 高斯函数一阶微分,x方向(用于改进的Harris角点提取算法) 
fx = [-2 -1 0 1 2];                 % x方向梯度算子(用于Harris角点提取算法) 
Ix = filter2(fx,ori_im);              % x方向滤波 
% fy = [-1 -1 -1;0 0 0;1 1 1];          % 高斯函数一阶微分,y方向(用于改进的Harris角点提取算法) 
fy = [-2;-1;0;1;2];                 % y方向梯度算子(用于Harris角点提取算法) 
Iy = filter2(fy,ori_im);              % y方向滤波 

3)考虑到图像一般情况下的噪声影响,采用高斯滤波去除噪声点。

Ix2 = Ix.^2; 
Iy2 = Iy.^2; 
Ixy = Ix.*Iy; 
clear Ix; 
clear Iy; 
h= fspecial('gaussian',[7 7],2);      % 产生7*7的高斯窗函数,sigma=2 
 
Ix2 = filter2(h,Ix2); 
Iy2 = filter2(h,Iy2); 
Ixy = filter2(h,Ixy); 

4)计算角点的准则函数R(即用一个值来判断该点来衡量这个点是否是角点),并标记角点(R(i,j)>0.01*Rmax,且R(i,j)为3x3邻域局部最大值)。

M = [Ix2(i,j) Ixy(i,j);Ixy(i,j) Iy2(i,j)]; 
R(i,j) = det(M)-k*(trace(M))^2; % 计算R

【可以通过改变准则函数的计算来改进harris算法,上式中的k一般取0.04~0.06】

[height,width] = size(ori_im); 
result = zeros(height,width);         % 纪录角点位置,角点处result的值为1 
R = zeros(height,width); 

  

Rmax = 0;                              % 图像中最大的R值 
for i = 1:height 
    for j = 1:width 
        M = [Ix2(i,j) Ixy(i,j);Ixy(i,j) Iy2(i,j)];       
        R(i,j) = det(M)-0.06*(trace(M))^2;          
        if R(i,j) > Rmax 
            Rmax = R(i,j); 
        end 
    end
end
 
cnt = 0; %角点个数
for i = 2:height-1 
    for j = 2:width-1 
        % 进行非极大抑制,窗口大小3*3 
        if R(i,j) > 0.01*Rmax && R(i,j) > R(i-1,j-1) && R(i,j) > R(i-1,j) && R(i,j) > R(i-1,j+1) && R(i,j) > R(i,j-1) && R(i,j) > R(i,j+1) && R(i,j) > R(i+1,j-1) && R(i,j) > R(i+1,j) && R(i,j) > R(i+1,j+1) 
            result(i,j) = 1; 
            cnt = cnt+1; 
        end
    end
end
 
[posc, posr] = find(result == 1); 
disp(cnt);                 % 显示角点个数 
imshow(ori_im); 
hold on; 
plot(posr,posc,'r+'); 

 图像处理--角点检测(Harris以及其他算法研究)_第1张图片

原图来自http://zh.wikipedia.org/wiki/%E8%A7%92%E6%A3%80%E6%B5%8B

检测后:

为了验证harris算子的旋转不变性,将原图旋转30度,见下

       

 

 

关于角点检测的其他算法:

 1).susan算法

利用面积,如下:

如下图所示为SUSAN圆形模板与物体的5种几何位置关系,对于图像中非纹理区域的任一点,在以它为中心的模板窗中存在一块亮度与其相同的区域,这块区域即为SUSAN的USAN区域。USAN区域包含了图像结构的重要信息,

由图可知,当模板中心像素点位于区域内部时,USAN的面积最大,

当该像素点位于区域边界时,则面积为最大的一半,

当该像素点为角点时,USAN区域面积约为最大的1/4。

SUSAN根据不同位置时USAN区域的面积来考察当前像素点为区域内部点、边缘点或角点。

图像处理--角点检测(Harris以及其他算法研究)_第2张图片

值得注意的是,关于计算usan面积,在圆邻域中,当像素点与某一点的灰度差小于某一阈值(通常取十分之一的极值(最大值-最小值))时,则认为该点在usan内。

 

2) CSS角点检测

 

通过canny算子计算出图像的edge,然后对edge进行表示成:

Γ (u)=[X(u,δ),Y(u,δ)](x(u,δ)表示高斯滤波后的横坐标,...)

对曲线上的点计算曲率,

图像处理--角点检测(Harris以及其他算法研究)_第3张图片

选择曲率局部极大值点作为候选值点,当点同时满足下面两个条件时,认为该点为角点:

a.大于阈值T;

b.至少大于两侧相邻的点曲率极小值的两倍。

【对于canny提取出的曲线的填补(曲线可能有断裂),形成T型角点,若得出的角点与T型角点相邻,去掉T型角点】

3)

还有诸多算法,留待以后讨论。

参考:http://walle.sdsmt.edu/faculty/rhoover/teaching/F11/692/Papers/HarrisStephens.pdf

以及F. Mokhtarian and R. Suomela, Robust Image Corner Detection Trough Curvature Scale Space, TPAMI, Vol. 20, No. 12, 1998.

 

转载请注明:http://www.cnblogs.com/blue-lg/archive/2011/12/17/2291139.html


你可能感兴趣的:(图像处理--角点检测(Harris以及其他算法研究))