1. 程式人生 > >MATLAB——Harris角點檢測

MATLAB——Harris角點檢測

為完成對棋盤標板的角點檢測,特此記錄。

角點:最直接的定義為在水平、垂直兩個方向上變化均較大的點

最常用的角點檢測演算法為Harris角點檢測方法,原理如下:

  1. 計算影象I(x,y)在X和Y兩個方向的梯度Ix、Iy
  2. 計算影象兩個方向梯度的乘積
  3. 使用高斯函式對Ix^2、Iy^2和Ixy進行高斯加權(取σ=1),生成矩陣M的元素A、B和C
  4. 計算每個畫素的Harris響應值R,並對小於某一閾值t的R置為零
  5. 在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對結果有些微影響,該方法存在一個問題,對同一個角點會重複檢測:在同一個角點附近同時定位出座標相差細微的多個角點座標,對最終結果造成影響。