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

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

環境:Windows xp+MATLAB 2010b

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

 

算法介紹:

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

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+'); 

 

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

檢測後:

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

       

 

 

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

 1).susan算法

利用面積,如下:

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

由圖可知,當模板中心像素點位於區域內部時,USAN的面積最大,

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

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

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

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

 

2) CSS角點檢測

 

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

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

對曲線上的點計算曲率,

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

a.大於閾值T;

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

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

3)

還有諸多算法,留待以後討論。

參考:http://walle.sdsmt.edu/faculty/rhoover/teaching/F11/692/Papers/HarrisStephens.pdf

以及F. Mokhtarian and R. Suomela, Robust Image Corner Detection Trough Curvature Scale Space, TPAMI, Vol. 20, No. 12, 1998.


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值