环境: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+');
原图来自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区域的面积来考察当前像素点为区域内部点、边缘点或角点。
值得注意的是,关于计算usan面积,在圆邻域中,当像素点与某一点的灰度差小于某一阈值(通常取十分之一的极值(最大值-最小值))时,则认为该点在usan内。
2) CSS角点检测
通过canny算子计算出图像的edge,然后对edge进行表示成:
Γ (u)=[X(u,δ),Y(u,δ)](x(u,δ)表示高斯滤波后的横坐标,...)
对曲线上的点计算曲率,
选择曲率局部极大值点作为候选值点,当点同时满足下面两个条件时,认为该点为角点:
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