MATLAB——Harris角點檢測
阿新 • • 發佈:2018-12-31
為完成對棋盤標板的角點檢測,特此記錄。
角點:最直接的定義為在水平、垂直兩個方向上變化均較大的點
最常用的角點檢測演算法為Harris角點檢測方法,原理如下:
- 計算影象I(x,y)在X和Y兩個方向的梯度Ix、Iy
- 計算影象兩個方向梯度的乘積
- 使用高斯函式對Ix^2、Iy^2和Ixy進行高斯加權(取σ=1),生成矩陣M的元素A、B和C
- 計算每個畫素的Harris響應值R,並對小於某一閾值t的R置為零
- 在3×3或5×5的鄰域內進行非最大值抑制,區域性最大值點即為影象中的角點
在matlab中對該方法進行了實驗,程式碼如下:
function [posr,posc]=Harris1(in_image,a) % 功能:檢測影象harris角點 % in_image-待檢測的rgb影象陣列 % a--角點引數響應,取值範圍:0.04~0.06 % [posr,posc]-角點座標 in_image=rgb2gray(in_image); I=double(in_image); %%%%計算xy方向梯度%%%%% fx=[-1,0,1];%x方向梯度模板 Ix=filter2(fx,I);%x方向濾波 fy=[-1;0;1];%y方向梯度模板(注意是分號) Iy=filter2(fy,I); %%%%計算兩個方向梯度的乘積%%%%% Ix2=Ix.^2; Iy2=Iy.^2; Ixy=Ix.*Iy; %%%%使用高斯加權函式對梯度乘積進行加權%%%% %產生一個7*7的高斯窗函式,sigma值為2 h=fspecial('gaussian',[3,3],2); IX2=filter2(h,Ix2); IY2=filter2(h,Iy2); IXY=filter2(h,Ixy); %%%%%計算每個像元的Harris響應值%%%%% [height,width]=size(I); R=zeros(height,width); %畫素(i,j)處的Harris響應值 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)-a*(trace(M))^2; end end %%%%%去掉小閾值的Harris值%%%%% Rmax=max(max(R)); %閾值 t=0.005*Rmax; for i=1:height for j=1:width if R(i,j)<t R(i,j)=0; end end end %%%%%進行3*3領域非極大值抑制%%%%%%%%% corner_peaks=imregionalmax(R); %imregionalmax對二維圖片,採用8領域(預設,也可指定)查詢極值,三維圖片採用26領域 %極值置為1,其餘置為0 num=sum(sum(corner_peaks)); %%%%%%顯示所提取的Harris角點%%%% [posr,posc]=find(corner_peaks==1); figure; imshow(uint8(in_image)); hold on for i=1:length(posr) plot(posc(i),posr(i),'r+'); end end
對於規則的棋盤標板,可準確檢測,對於不規則的棋盤標板,邊緣區域存在誤差,改變角點引數a對結果有些微影響,該方法存在一個問題,對同一個角點會重複檢測:在同一個角點附近同時定位出座標相差細微的多個角點座標,對最終結果造成影響。