1. 程式人生 > >Harris角點提取演算法及實現

Harris角點提取演算法及實現

角點:最直觀的印象就是在水平、豎直兩個方向上變化均較大的點,即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-11A = 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.');% 在灰度影象上用綠色‘.‘標出角點的位置