圖像處理--角點檢測(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.