天天看點

圖像處理--角點檢測(Harris以及其他算法研究)

環境:Windows xp+MATLAB 2010b

提及角點檢測,就不能忘了最經典的Harris角點檢測算法,下面就主要介紹下Harris算法及其matlab實作。

算法介紹:

1)通常情況下,可以将區域内的點分為3類,a.平坦的點,b.邊緣上的點,c.角點。

圖像處理--角點檢測(Harris以及其他算法研究)

2)若對于這3類點分别求取Ix,Iy,很顯然,a類點的Ix和Iy都很小,b類點則是Ix和Iy有一個稍大一個稍小,而角點c則是兩個值都很大。是以根據這種性質,可以區分出角點來。

求解Ix,Iy的過程說明:

利用單方向上(橫軸&縱軸),點與周圍點的差分來計算,有兩種方法,

一是,取3x3鄰域計算,通常取

Ix子模闆:          Iy子模闆:

-1 0 1            -1 -1 -1

-1 0 1             0  0  0

-1 0 1             1  1  1

先對圖像矩陣上每一點分别求取其Ix,Iy乘積後疊加的值,記為Ix(m,n),Iy(m,n).(其中,m,n分别為原矩陣的大小)

二是,直接隻采用橫軸和縱軸上的點計算差分。

% fx = [-1 0 1;-1 0 1;-1 0 1];          % 高斯函數一階微分,x方向(用于改進的Harris角點提取算法) 
fx = [-2 -1 0 1 2];                 % x方向梯度算子(用于Harris角點提取算法) 
Ix = filter2(fx,ori_im);              % x方向濾波 
% fy = [-1 -1 -1;0 0 0;1 1 1];          % 高斯函數一階微分,y方向(用于改進的Harris角點提取算法) 
fy = [-2;-1;0;1;2];                 % y方向梯度算子(用于Harris角點提取算法) 
Iy = filter2(fy,ori_im);              % y方向濾波      

3)考慮到圖像一般情況下的噪聲影響,采用高斯濾波去除噪聲點。

Ix2 = Ix.^2; 
Iy2 = Iy.^2; 
Ixy = Ix.*Iy; 
clear Ix; 
clear Iy; 
h= fspecial('gaussian',[7 7],2);      % 産生7*7的高斯窗函數,sigma=2 
 
Ix2 = filter2(h,Ix2); 
Iy2 = filter2(h,Iy2); 
Ixy = filter2(h,Ixy);      

4)計算角點的準則函數R(即用一個值來判斷該點來衡量這個點是否是角點),并标記角點(R(i,j)>0.01*Rmax,且R(i,j)為3x3鄰域局部最大值)。

M = [Ix2(i,j) Ixy(i,j);Ixy(i,j) Iy2(i,j)]; 

R(i,j) = det(M)-k*(trace(M))^2; % 計算R

【可以通過改變準則函數的計算來改進harris算法,上式中的k一般取0.04~0.06】

[height,width] = size(ori_im); 
result = zeros(height,width);         % 紀錄角點位置,角點處result的值為1 
R = zeros(height,width);      
Rmax = 0;                              % 圖像中最大的R值 
for i = 1:height 
    for j = 1:width 
        M = [Ix2(i,j) Ixy(i,j);Ixy(i,j) Iy2(i,j)];       
        R(i,j) = det(M)-0.06*(trace(M))^2;          
        if R(i,j) > Rmax 
            Rmax = R(i,j); 
        end 
    end
end
 
cnt = 0; %角點個數
for i = 2:height-1 
    for j = 2:width-1 
        % 進行非極大抑制,視窗大小3*3 
        if R(i,j) > 0.01*Rmax && R(i,j) > R(i-1,j-1) && R(i,j) > R(i-1,j) && R(i,j) > R(i-1,j+1) && R(i,j) > R(i,j-1) && R(i,j) > R(i,j+1) && R(i,j) > R(i+1,j-1) && R(i,j) > R(i+1,j) && R(i,j) > R(i+1,j+1) 
            result(i,j) = 1; 
            cnt = cnt+1; 
        end
    end
end
 
[posc, posr] = find(result == 1); 
disp(cnt);                 % 顯示角點個數 
imshow(ori_im); 
hold on; 
plot(posr,posc,'r+');      

 

圖像處理--角點檢測(Harris以及其他算法研究)

原圖來自​​http://zh.wikipedia.org/wiki/%E8%A7%92%E6%A3%80%E6%B5%8B​​

檢測後:

圖像處理--角點檢測(Harris以及其他算法研究)

為了驗證harris算子的旋轉不變性,将原圖旋轉30度,見下

圖像處理--角點檢測(Harris以及其他算法研究)
圖像處理--角點檢測(Harris以及其他算法研究)

關于角點檢測的其他算法:

 1).susan算法

利用面積,如下:

如下圖所示為SUSAN圓形模闆與物體的5種幾何位置關系,對于圖像中非紋理區域的任一點,在以它為中心的模闆窗中存在一塊亮度與其相同的區域,這塊區域即為SUSAN的USAN區域。USAN區域包含了圖像結構的重要資訊,

由圖可知,當模闆中心像素點位于區域内部時,USAN的面積最大,

當該像素點位于區域邊界時,則面積為最大的一半,

當該像素點為角點時,USAN區域面積約為最大的1/4。

SUSAN根據不同位置時USAN區域的面積來考察目前像素點為區域内部點、邊緣點或角點。

圖像處理--角點檢測(Harris以及其他算法研究)

值得注意的是,關于計算usan面積,在圓鄰域中,當像素點與某一點的灰階差小于某一門檻值(通常取十分之一的極值(最大值-最小值))時,則認為該點在usan内。

2) CSS角點檢測

通過canny算子計算出圖像的edge,然後對edge進行表示成:

Γ (u)=[X(u,δ),Y(u,δ)](x(u,δ)表示高斯濾波後的橫坐标,...)

對曲線上的點計算曲率,

圖像處理--角點檢測(Harris以及其他算法研究)

選擇曲率局部極大值點作為候選值點,當點同時滿足下面兩個條件時,認為該點為角點:

a.大于門檻值T;

b.至少大于兩側相鄰的點曲率極小值的兩倍。

【對于canny提取出的曲線的填補(曲線可能有斷裂),形成T型角點,若得出的角點與T型角點相鄰,去掉T型角點】

3)