本文將從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/u010278305spa
本文涉及到的知識點以下:.net
一、高斯卷積。設計
二、Harris角點檢測。code
程序設計流程以下:blog
一、先將論文涉及該算法的主要部分給出截圖:ci
設計程序時,首先要完成論文的這一部分,計算出A、B、C。
二、運用高斯窗對其進行濾波。
高斯函數以下:
用matlab生成一個高斯卷積核的方法:
h=fspecial('gaussian',[5 1],1.5); w=h*h';
三、遍歷圖像的每一點,求其M矩陣,並計算出R(以後用於判斷是不是角點)。
M矩陣爲:
R的計算方法爲:
4、判斷是不是角點。
若是R大於0且大於Q*RMax,則認爲它是角點,RMax爲R的最大值,Q爲一個常數係數。
五、對角點進行篩選。只有在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; %生成高斯卷積核,對X二、Y二、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