Harris角點提取演算法及實現
阿新 • • 發佈:2018-12-27
角點:最直觀的印象就是在水平、豎直兩個方向上變化均較大的點,即Ix、Iy都較大
邊緣:僅在水平、或者僅在豎直方向有較大的變化量,即Ix和Iy只有其一較大
平坦地區:在水平、豎直方向的變化量均較小,即Ix、Iy都較小
2 strong eigenvalues======interest point
1 strong eigenvalues======contour/edge
0 eigenvalues ======uniform region
角點響應
R=det(M)-k*(trace(M)^2) (k=0.04~0.06)
det(M)=λ1*λ2 trace(M)=λ1+λ2
R取決於M的特徵值,對於角點|R|很大,平坦的區域|R|很小。
程式設計步驟:
function [u,v]=CF(Image_a)
%Harris角點提取演算法並精確至亞畫素級
%t=input('z1.jpg','s'); % 提示輸入要處理的影象
% clear;clc;
% tic; %計時開始
% Image1 = imread('e:\images\8.jpg'); % 讀取影象
Image_a = rgb2gray(Image_a);% 轉化為灰度影象
Image=Image_a ;
%%%%%%%%% %%%%%%%%%%%%%%%%%%角點從第5行第5列開始找%%%%%%%%%%%%%
Image(1:4,:)=[];
Image(:,end-3:end)=[];
Image(end-3:end,:)=[];
Image(:,1:4)=[];
HdImage=Image; % 轉化後的灰度影象
fx = [-1 0 1;-1 0 1;-1 0 1]; % x方向的Prewitt運算元,用於對x方向濾波
Ix = filter2(fx,HdImage); % 對x方向濾波
fy = [-1 -1 -1;0 0 0;1 1 1]; % y方向的Prewitt運算元,用於對y方向濾波
Iy = filter2(fy,HdImage);% 對y方向濾波
Ix2 = Ix.^2; % .^2用來求陣列的平方
Iy2 = Iy.^2; % .^2用來求陣列的平方
Ixy = Ix.*Iy;% 陣列相乘
h= fspecial('gaussian',[60 60],2); % 產生9*9的高斯視窗,sigma=2,產生的視窗越大,得到的角點越少(7-11)
A = filter2(h,Ix2);% 用產生的高斯視窗處理Ix2得到A
B = filter2(h,Iy2);% 用產生的高斯視窗處理Iy2得到B
C = filter2(h,Ixy); % 用產生的高斯視窗處理Ixy得到C
height = size(HdImage,1); % 計算影象的第一維的元素數,即行數
width = size(HdImage,2); % 計算影象的第二維的元素數,即列數
CRF = zeros(height,width); % 生成一個和影象大小一致的全0的double型陣列,用來儲存角點響應函式值
CRFmax = 0; % 儲存影象中最大的角點響應函式值
%M = [A(i,j) C(i,j);C(i,j) B(i,j)];
%CRF(i,j) = det(M)-0.05*(trace(M))^2; % 計算角點響應函式值,k的取值一般在0.04--0.06
CRF=(A.*B - C.^2) - 0.05*(A + B).^2; % 程式碼的優化把for迴圈改為向量迴圈,k=0.05
CRFmax=max(max(CRF)); % ME01=max(E02)%對一個矩陣的每一列求最大值;找到最大的角點響應函式(用來設定閾值時用)
l=ordfilt2(CRF,10^2,ones(10));% 生成在7*7的視窗進行非最大值抑制(排序濾波器)
k=(l==CRF)&(CRF>0.001*CRFmax);% 設定閾值為0.01*CRFmax,只有是區域性最大值並且角點響應函式值大於閾值才是角點
[v1,u1] = find(k); % 找到角點是的位置,並儲存,m*n影象中,u是n量,縱座標,v是m量,橫座標。
v=v1+4;
u=u1+4;
count = size(v,1); % 用來記錄角點的個數
disp('檢測到的角點個數為:')
disp(count) % 輸出角點個數
figure,imshow(HdImage); % 顯示灰度影象
hold on;
plot(u1,v1,'g.');% 在灰度影象上用綠色‘.‘標出角點的位置