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/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

相關文章
相關標籤/搜索