本文將從Harries角點檢測的原理出發,講述怎么用matlab一步步實現Harris角點檢測算法。
matlab可以用corner直接調用Harris角點檢測算法,但為了學習如何提取特征點,本文用matlab將其實現,純粹出於學習目的。由於harris角點特征點相對比較簡單,容易實現,這位學習別的特征點檢測打下基礎。程序中出現的定常數均采用Matlab中corner實現該算法時的默認值。
在實現的過程中,主要是參考了Chris Harris & Mike Stephens在1988年發表的那篇文章A COMBINED CORNER AND EDGE DETECTOR。
本文一部分圖像及公式來源於百度文庫的一篇PPT:Harris角點檢測,可自行檢索獲得。
轉載請注明出處:http://blog.csdn.net/u010278305
本文涉及到的知識點如下:
1、高斯卷積。
2、Harris角點檢測。
程序設計流程如下:
1、先將論文涉及該算法的主要部分給出截圖:

設計程序時,首先要完成論文的這一部分,計算出A、B、C。
2、運用高斯窗對其進行濾波。
高斯函數如下:

用matlab生成一個高斯卷積核的方法:
h=fspecial('gaussian',[5 1],1.5);
w=h*h';
3、遍歷圖像的每一點,求其M矩陣,並計算出R(之后用於判斷是否是角點)。
M矩陣為:

R的計算方法為:

4、判斷是否是角點。
如果R大於0且大於Q*RMax,則認為它是角點,RMax為R的最大值,Q為一個常數系數。
5、對角點進行篩選。只有在8鄰域內是最大值的店才會被認為是角點。
下面給出源代碼:
%function:
% Harris角點檢測
%注意:
% matlab自帶的corner函數即可實現harris角點檢測。但考慮到harris角點的經典性,本程序將其實現,純粹出於學習目的,了解特征點檢測的方法。
% 其中所有參數均與matlab默認保持一致
%referrence:
% Chris Harris & Mike Stephens,A COMBINED CORNER AND EDGE DETECTOR
%date:2015-1-11
%author:chenyanan
%轉載請注明出處:http://blog.csdn.net/u010278305
%清空變量,讀取圖像
clear;close all
src= imread('images/girl.jpg');
gray=rgb2gray(src);
gray = im2double(gray);
%縮放圖像,減少運算時間
gray = imresize(gray, 0.2);
%計算X方向和Y方向的梯度及其平方
X=imfilter(gray,[-1 0 1]);
X2=X.^2;
Y=imfilter(gray,[-1 0 1]');
Y2=Y.^2;
XY=X.*Y;
%生成高斯卷積核,對X2、Y2、XY進行平滑
h=fspecial('gaussian',[5 1],1.5);
w=h*h';
A=imfilter(X2,w);
B=imfilter(Y2,w);
C=imfilter(XY,w);
%k一般取值0.04-0.06
k=0.04;
RMax=0;
size=size(gray);
height=size(1);
width=size(2);
R=zeros(height,width);
for h=1:height
for w=1:width
%計算M矩陣
M=[A(h,w) C(h,w);C(h,w) B(h,w)];
%計算R用於判斷是否是邊緣
R(h,w)=det(M) - k*(trace(M))^2;
%獲得R的最大值,之后用於確定判斷角點的閾值
if(R(h,w)>RMax)
RMax=R(h,w);
end
end
end
%用Q*RMax作為閾值,判斷一個點是不是角點
Q=0.01;
R_corner=(R>=(Q*RMax)).*R;
%尋找3x3鄰域內的最大值,只有一個交點在8鄰域內是該鄰域的最大點時,才認為該點是角點
fun = @(x) max(x(:));
R_localMax = nlfilter(R,[3 3],fun);
%尋找既滿足角點閾值,又在其8鄰域內是最大值點的點作為角點
%注意:需要剔除邊緣點
[row,col]=find(R_localMax(2:height-1,2:width-1)==R_corner(2:height-1,2:width-1));
%繪制提取到的角點
figure('name','Result');
subplot(1,2,1),imshow(gray),title('my-Harris'),
hold on
plot(col,row, 'b*'),
hold off
%用matlab自帶的edge函數提取Harris角點,對比效果
C = corner(gray);
subplot(1,2,2),imshow(gray),title('matlab-conner'),
hold on
plot(C(:,1), C(:,2), 'r*');
hold off
下面給出本程序運行效果與matlab的corner運行效果的對比圖:

測試文件你可以仔細選取,或者在之前發布的博客中找到。
轉載請注明出處:http://blog.csdn.net/u010278305
