Matlab圖像處理學習筆記(五):Harris角點檢測


本文將從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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM