前言
角点是图像中一个重要的局部特征,它决定了图像中关键区域的形状,体现了图像中重要的特征信号,所以在目标识别、图像匹配、图像重构等方面具有十分重要的意义。对角点的定义一般可以分为以下三种:图像边界曲线具有极大曲率值的点、图像中梯度值和梯度变化率很高的点、图像边界方向变化不连续的点。定义不同,角点的提取方法也不尽相同,如下所述。
1.基于图像边缘的检测方法
该类方法需要对图像的边缘进行编码,这在很大程序.上依赖于图像的分割和边缘提取,具有较大的计算量,一旦待检测目标局部发生变化,则很可能导致操作失败。早期主要有Rosenfeld和Freeman等人所提出的方法,后期有曲率尺度空间等方法。
2.基于图像灰度的检测方法
该类方法通过计算点的曲率及梯度来检测角点,可避免基于图像边缘的检测方法存在的缺陷,是目前研究的重点。该类方法主要有Moravec、Forstner、 Harris 和SUSAN算子等。
Harris基本原理
1.图像中的边缘
一个特征值大,另一个特征值小,也就是说灰度变化在某个方向上变化大,在某个方向上变化小,对应图像的边缘或者直线。
2.图像中的平面
两个特征值都很小,此时灰度变化不明显,对应图像的平面区域。
3.图像中的角点
两个特征值都很大,灰度值沿多个方向都有较大的变化,因此可认为其是角点。由于求解矩阵M的特征值需要较大的计算量,而两个特征值的和等于矩阵M的积,两个特征值的积等于矩阵M的行列式,所以Harris使用一个角点响应值R来判定角点质。
式中,k是经验常数,一般取值范围为0.04~0.06。
Harris算法流程
(1)首先,计算图像I(x,y)在x和v两个方向上的梯度I。
(2)其次,计算每一个像素点上的相关矩阵M ;
(3)然后,计算每个像素点的Harris角点响应值R:
(4)最后,在NxN范围内寻找极大值点,如果其Harris响应大于阈值,则可将其视为角点。
Harris角点性质
1.敏感因子k对角点检测有影响
2. Harris 算子具有灰度不变性:
由于Harris在进行Harris 角点检测时,使用了微分算子,因此对图像的亮度和对比度进行仿射变换并不改变Harris响应R的极值出现位置,只是由于阈值的选择,可能会影响.检测角点的数量。
3. Harris 算子具有旋转不变性
二阶矩阵M可以表示为一个椭圆,当椭圆旋转时,特征值并不随其变化,判断角点的R值也不发生变化,因此Harris算子具有选择不变性。当然,平移更不会引起Harris算子的变化。
4. Harris 算子不具有尺度不变性
如下图所示,当其左图被缩小时,在检测窗口尺寸不变时,窗口内所包含的图像是完全不同的。其左图可能被检测为边缘,而其右图则可能被检测为角点。
程序实现
Harris:
function varargout=harris(I,k,q,h) narginchk(0,4); nargoutchk(0,2); if nargin<1 I=checkerboard(50,2,2); end if nargin<2 k=0.04; end if nargin<3 q=0.01; end if nargin<3 h=fspecial('gaussian',[5 5],1.5); end fx=[-2,-1,0,1,2]; Ix=filter2(fx,I); fy=[-2,-1,0,1,2]'; Iy=filter2(fy,I); Ix2=filter2(h,Ix.^2); Iy2=filter2(h,Iy.^2); Ixy=filter2(h,Ix.*Iy); rfcn=@(a,b,c)(a*b-c^2)-k*(a+b)^2; R=arrayfun(rfcn,Ix2,Iy2,Ixy); R(R < q*max(R(:)))=0; [xp,yp]=find(imregionalmax(R,8)); if nargout==0 subplot(121) imshow(I); hold on; plot(xp,yp,'ro'); title('自己编写HARRIS算法') subplot(122) cp=corner(I); imshow(I) hold on plot(cp(:,1),cp(:,2),'ro'); title('MATLAB自带CORNER函数') elseif nargout==1 varargout={[xp,yp]}; elseif nargout==2 varargout={xp,yp}; end
其实在MATLAB图像处理工具箱中提供的corner()函数可以直接用来检测图像的Harris角点特征。下面对使用harris()函数和corner()函数计算的结果进行对比。
main
clc; clear all; close all; I = checkerboard(50,3,3); h = fspecial('gaussian',[5 5],2); harris(I,0.05,0.01,h);
1.尺度影响
Harris算子对尺度很敏感,不具有尺度不变性。Mikolajczyk 和Schmid 剔除的Harris-Laplace检测方法将Harris 角点检测算子和高斯尺度空间相结合,使Harris角点检测具有尺度不变性。
2.阈值设置
根据阈值来判断角点,在Harris算法中阈值只能根据图像特征进行手动调整,很难设定一个合适的值使其能够适合整幅图像中角点的提取。参考文献[3]通过二次非极大值抑制,有效地避免设置阈值这一难点。
3.窗口选择
以局部最大值判断为角点,这与高斯窗的选取有极大关系:若高斯窗选择过大,则会造成角点丢失;若高斯窗选择过小,则会造成大量的伪角点。参考文献[4]中通过对响应值R在x和y方向进行曲线拟合,然后寻找曲线的峰谷值的方式来确定角点。