Harris算子的运用 用于图像配准
Harris算子介紹:
該算子是C.Harris和M.J.Stephens在1988年提出的一種點特征提取算子。這種算子受信號處理中自相關函數的啟發,可以給出圖像中某一像素點的自相關矩陣肘,其特征值是自相關函數的一階曲率,如果算,Y兩個方向上的曲率值都高,那么就認為該點是角點。Harris角點檢測算子
Harris[2]角點檢測算子是Moravec角點檢測算子的改進.
(1)算子用高斯函數代替二值窗口函數,對離中心點越近的像素賦于越大的權重,以減少噪聲影響。
?????????????????????????????????????????????????? 圖1-3高斯函數
(2)算子只考慮了每隔45度方向,Harris算子用Taylor展開去近似任意方向。
寫成矩陣形式: :
?
??????????????????????????? 式子(1-2)
?????????????????????????? 式子(1-3)
式中,Ix為x方向的差分,Iy為y方向的差分,w(x,y)為高斯函數。
(3)Harris采用了一種新的角點判定方法。矩陣M的兩個特征向量l1和l2與矩陣M的主曲率成正比。Harris利用l1, l2來表征變化最快和最慢的兩個方向.若兩個都很大就是角點,一個大一個小就是邊緣,兩個都小就是在變化緩慢的圖像區域.
??????????????????????????????????????????????????????????????????????????????? 來自文獻[11]
圖1- 4用矩陣M的特征向量分類圖像像素點
但是解特征向量需要比較多的計算量,且兩個特征值的和等于矩陣M的跡,兩個特征值的積等于矩陣M的行列式。所以用(1-4)式來判定角點質量。(k常取0.04-0.06)
?? (1-4)
(4) Harris算法總結
Step 1:對每一像素點計算相關矩陣M。
Step 2:計算每像素點的Harris 角點響應。
Step 3.在w*w范圍內尋找極大值點,若Harris?角點響應大于閥值,則視為角點。
Harris算子對灰度的平移是不變的,因為只有差分,對旋轉也有不變性,但是對尺度很敏感,在一個尺度下是角點,?在在另一個尺度下可能就不是了.
????????????????? 圖1- 5 harris算子對尺度的敏感性
??????????????????? 圖1- 6 harris算子對簡單圖像的響應
?????????????? Harris?算子是一種有效的點特征提取算子,其優點總結起來有:
??????????????①計算簡單:Harris?算子中只用到灰度的一階差分以及濾波,操作簡單。
???????②提取的點特征均勻而且合理:Harris?算子對圖像中的每個點都計算其興趣值,然后在鄰域中選擇最優點。實驗表明,在紋理信息豐富的區域,Harris?算子可以提取出大量有用的特征點,而在紋理信息少的區域,提取的特征點則較少。
?????? ③穩定:Harris算子的計算公式中只涉及到一階導數,因此對圖像旋轉、灰度變化、噪聲影響和視點變換不敏感,它也是比較穩定的一種點特征提取算子。
???????????? Harris?算子的局限性有:
????? ①它對尺度很敏感,不具有尺度不變性。
????? ②提取的角點是像素級的。
代碼:
<span style="font-size:18px;">im=imread('lena.jpg'); tau=100; im=double(im); keyXs=[]; keyYs=[]; win=3; [height,width] = size(im); result = zeros(height,width); %Then I will get the gradients of the image along the x and y axises. sobel_x=1/4*[-1 0 1;-2 0 2;-1 0 1]; sobel_y=1/4*[-1 0 1;-2 0 2;-1 0 1]'; diffx=imfilter(im,sobel_x); %對圖像x方向進行梯度 diffy=imfilter(im,sobel_y); %對圖像y方向的梯度進行計算 %For smoothing the differentiation of the image along the x and y %direction, the gauss filter of the diffx and diffy is must. gauss_win=win; sigma=1; [x,y]=meshgrid(-gauss_win:gauss_win,-gauss_win:gauss_win); gauss2D=exp(-(x.^2+y.^2)/(2*sigma.^2)); %產生高斯算子 gauss2D=gauss2D/(sum(sum(gauss2D))); %對高斯算子進行歸一化 %Then calculate the M matrix. A=imfilter(diffx.*diffx,gauss2D); %二階x方向梯度進行高斯濾波 B=imfilter(diffy.*diffy,gauss2D); %二階y方向梯度進行高斯濾波 C=imfilter(diffx.*diffy,gauss2D); %對圖像x y方向的梯度進行高斯濾波%Harris mehtods. if(strcmp(tau,'Harris')) k=0.2; threshold=200; %Harris criteria. Harris=A.*B-C.^2-k*(A+B).^2; %Then I will do the non-maximum supression. supress_win=2; points_count=0; %%對圖像的每個像素進行閾值判斷是否是角點 for x=supress_win+1:width-supress_winfor y=supress_win+1:height-supress_win%Then you need to judge if the pixel has the biggest Harris%response in the (2*supress_win+1)*(2*supress_win+1) neighbour.temp=Harris(y,x); %得到圖像x y位置的harri值if(temp>threshold) %該點的haari值大于周圍像素的閾值時flag=0;for i=-supress_win:supress_winfor j=-supress_win:supress_winif(temp>=Harris(y+j,x+i))flag=flag+1; %像素的個數加1endendendif(flag==((2*supress_win+1)*(2*supress_win+1)))result(y,x)=1;points_count=points_count+1;keyXs(points_count)=x;keyYs(points_count)=y; %存儲haari角點的坐標endendend end</span>? 另一種代碼:
<span style="font-size:18px;">%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % Harris角點提取算法 % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% clear; %filename='487_r.png'; %X= imread('Circle.bmp'); % 讀取圖像 X= imread('001.jpg'); % 讀取圖像 %imshow(X); %Info=imfinfo(filename); % if Info.BitDepth>8 % f=rgb2gray(X); f=X; %end % % fx = [5 0 -5;8 0 -8;5 0 -5]; % 高斯函數一階微分,x方向(用于改進的Harris角點提取算法) ori_im=double(f)/255; %unit8轉化為64為雙精度double64 fx = [-2 -1 0 1 2]; % x方向梯度算子(用于Harris角點提取算法) Ix = filter2(fx,ori_im); % x方向濾波 % fy = [5 8 5;0 0 0;-5 -8 -5]; % 高斯函數一階微分,y方向(用于改進的Harris角點提取算法) fy = [-2;-1;0;1;2]; % y方向梯度算子(用于Harris角點提取算法) Iy = filter2(fy,ori_im); % y方向濾波 Ix2 = Ix.^2; Iy2 = Iy.^2; Ixy = Ix.*Iy; clear Ix; clear Iy;h= fspecial('gaussian',[7 7],2); % 產生7*7的高斯窗函數,sigma=2Ix2 = filter2(h,Ix2); Iy2 = filter2(h,Iy2); Ixy = filter2(h,Ixy);height = size(ori_im,1); width = size(ori_im,2); result = zeros(height,width); % 紀錄角點位置,角點處值為1R = zeros(height,width);Rmax = 0; % 圖像中最大的R值 for i = 1:heightfor j = 1:widthM = [Ix2(i,j) Ixy(i,j);Ixy(i,j) Iy2(i,j)]; % auto correlation matrixR(i,j) = det(M)-0.06*(trace(M))^2; % 計算Rif R(i,j) > RmaxRmax = R(i,j);end;end; end;cnt = 0; for i = 2:height-1for j = 2:width-1% 進行非極大抑制,窗口大小3*3if 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;i=1;for j=1:heightfor k=1:widthif result(j,k)==1;corners1(i,1)=j;corners1(i,2)=k;i=i+1;end;end;end;[posc, posr] = find(result == 1); cnt % 角點個數 imshow(ori_im) hold on; plot(posr,posc,'r+'); a=ginput(1); b=ginput(1); j=1; for i=1:cntif corners1(i,1)>a(1,2) && corners1(i,1)<b(1,2)if corners1(i,2)>a(1,1) && corners1(i,2)<b(1,1)B(j,1)=corners1(i,1);B(j,2)=corners1(i,2);j=j+1;endend end xlswrite('C:\Documents and Settings\ipsuser\桌面\Harris\ceshidata.xls',B,'Sheet1','C1');</span>總結
以上是生活随笔為你收集整理的Harris算子的运用 用于图像配准的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: MATLAB 图像函数(第五章) 图像
- 下一篇: Shi-Tomasi算子的运用 ,用于检