Study - 基于Harris的角点特征检测

简介: Study - 基于Harris的角点特征检测

前言


  角点是图像中一个重要的局部特征,它决定了图像中关键区域的形状,体现了图像中重要的特征信号,所以在目标识别、图像匹配、图像重构等方面具有十分重要的意义。对角点的定义一般可以分为以下三种:图像边界曲线具有极大曲率值的点、图像中梯度值和梯度变化率很高的点、图像边界方向变化不连续的点。定义不同,角点的提取方法也不尽相同,如下所述。


1.基于图像边缘的检测方法


  该类方法需要对图像的边缘进行编码,这在很大程序.上依赖于图像的分割和边缘提取,具有较大的计算量,一旦待检测目标局部发生变化,则很可能导致操作失败。早期主要有Rosenfeld和Freeman等人所提出的方法,后期有曲率尺度空间等方法。


2.基于图像灰度的检测方法


  该类方法通过计算点的曲率及梯度来检测角点,可避免基于图像边缘的检测方法存在的缺陷,是目前研究的重点。该类方法主要有Moravec、Forstner、 Harris 和SUSAN算子等。



Harris基本原理


1.图像中的边缘


  一个特征值大,另一个特征值小,也就是说灰度变化在某个方向上变化大,在某个方向上变化小,对应图像的边缘或者直线。


2.图像中的平面


  两个特征值都很小,此时灰度变化不明显,对应图像的平面区域。


3.图像中的角点


  两个特征值都很大,灰度值沿多个方向都有较大的变化,因此可认为其是角点。由于求解矩阵M的特征值需要较大的计算量,而两个特征值的和等于矩阵M的积,两个特征值的积等于矩阵M的行列式,所以Harris使用一个角点响应值R来判定角点质。

image.png

式中,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 算子不具有尺度不变性


如下图所示,当其左图被缩小时,在检测窗口尺寸不变时,窗口内所包含的图像是完全不同的。其左图可能被检测为边缘,而其右图则可能被检测为角点。

image.png


程序实现


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);

image.png

1.尺度影响


  Harris算子对尺度很敏感,不具有尺度不变性。Mikolajczyk 和Schmid 剔除的Harris-Laplace检测方法将Harris 角点检测算子和高斯尺度空间相结合,使Harris角点检测具有尺度不变性。


2.阈值设置


  根据阈值来判断角点,在Harris算法中阈值只能根据图像特征进行手动调整,很难设定一个合适的值使其能够适合整幅图像中角点的提取。参考文献[3]通过二次非极大值抑制,有效地避免设置阈值这一难点。


3.窗口选择


  以局部最大值判断为角点,这与高斯窗的选取有极大关系:若高斯窗选择过大,则会造成角点丢失;若高斯窗选择过小,则会造成大量的伪角点。参考文献[4]中通过对响应值R在x和y方向进行曲线拟合,然后寻找曲线的峰谷值的方式来确定角点。



相关文章
|
1月前
|
存储 资源调度 算法
Opencv(C++)系列学习---SIFT、SURF、ORB算子特征检测
Opencv(C++)系列学习---SIFT、SURF、ORB算子特征检测
|
1月前
|
存储 算法 计算机视觉
OpenCV(四十二):Harris角点检测
OpenCV(四十二):Harris角点检测
28 0
|
1月前
|
算法 C++ 计算机视觉
Opencv(C++)学习系列---Laplacian拉普拉斯边缘检测算法
Opencv(C++)学习系列---Laplacian拉普拉斯边缘检测算法
|
4月前
|
算法 计算机视觉
OpenCV对图像进行Otsu二值分割、Canny边缘检测、Harris角点检测实战(附源码)
OpenCV对图像进行Otsu二值分割、Canny边缘检测、Harris角点检测实战(附源码)
36 0
|
5月前
harris角点检测
harris角点检测
19 0
|
9月前
|
算法 计算机视觉
一种基于Harris-Laplace算法的角点检测方法(Matlab代码实现)
一种基于Harris-Laplace算法的角点检测方法(Matlab代码实现)
146 0
|
11月前
|
算法 API 计算机视觉
图像特征提取与描述_角点特征01:Harris算法+Shi-Tomas算法
Harris角点检测的思想是通过图像的局部的小窗口观察图像,角点的特征是窗口沿任意方向移动都会导致图像灰度的明显变化
110 0
|
11月前
|
资源调度 算法 机器人
图像特征提取与描述_角点特征02:SIFT算法+SURF算法
前面两节我们介绍了Harris和Shi-Tomasi角点检测算法,这两种算法具有旋转不变性,但不具有尺度不变性,以下图为例,在左侧小图中可以检测到角点,但是图像被放大后,在使用同样的窗口,就检测不到角点了。
118 0
|
算法 计算机视觉
全景拼接|Harris角点检测,RANSAC以及HOG描述符完成
全景拼接|Harris角点检测,RANSAC以及HOG描述符完成
281 0
|
计算机视觉
OpenCV | OpenCV哈里斯 (Harris)角点检测
OpenCV | OpenCV哈里斯 (Harris)角点检测
132 0
OpenCV | OpenCV哈里斯 (Harris)角点检测