MatLab角点检測(harris经典程序)
http://blog.csdn.net/makenothing/article/details/12884331
这是源博客的出处,鄙人转过来是为了更好的保存!供大家一起学习!已将原始的博客的文章的位置附在上面!
至于代码的完整性和可执行性须要大家去自己考量!
%MatLab角点检測程序harris。 ori_im2=rgb2gray(imread('2.bmp')); %ori_im2=imresize(ori_im2',0.50,'bicubic'); %加上这句图就变成竖着的了 fx = [5 0 -5;8 0 -8;5 0 -5]; % % la gaucienne,ver axe x Ix = filter2(fx,ori_im2); % la convolution vers axe x fy = [5 8 5;0 0 0;-5 -8 -5]; % la gaucienne,ver axe y Iy = filter2(fy,ori_im2); % la convolution vers axe y Ix2 = Ix.^2; Iy2 = Iy.^2; Ixy = Ix.*Iy; clear Ix; clear Iy; h= fspecial('gaussian',[3 3],2); % générer une fonction gaussienne,sigma=2 Ix2 = filter2(h,Ix2); Iy2 = filter2(h,Iy2); Ixy = filter2(h,Ixy); height = size(ori_im2,1); width = size(ori_im2,2); result = zeros(height,width); % enregistrer la position du coin R = zeros(height,width); K=0.04; Rmax = 0; % chercher la valeur maximale de R 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)-K*(trace(M))^2; % % calcule R if R(i,j) > Rmax Rmax = R(i,j); end; end; end; cnt = 0; for i = 2:height-1 for j = 2:width-1 % réduire des valuers minimales ,la taille de fenetre 3*3 if 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; [posr2, posc2] = find(result == 1); cnt % compter des coins figure imshow(ori_im2); hold on; plot(posc2,posr2,'w*');
harris优化的角点检測
%%%Prewitt Operator Corner Detection.m %%%时间优化--相邻像素用取差的方法 %% clear; Image = imread('15.bmp'); % 读取图像 Image = im2uint8(rgb2gray(Image)); dx = [-1 0 1;-1 0 1;-1 0 1]; %dx:横向Prewitt差分模版 Ix2 = filter2(dx,Image).^2; Iy2 = filter2(dx',Image).^2; Ixy = filter2(dx,Image).*filter2(dx',Image); %生成 9*9高斯窗体。窗体越大,探測到的角点越少。 h= fspecial('gaussian',9,2); A = filter2(h,Ix2); % 用高斯窗体差分Ix2得到A B = filter2(h,Iy2); C = filter2(h,Ixy); nrow = size(Image,1); ncol = size(Image,2); Corner = zeros(nrow,ncol); %矩阵Corner用来保存候选角点位置,初值全零,值为1的点是角点 %真正的角点在137和138行由(row_ave,column_ave)得到 %參数t:点(i,j)八邻域的“类似度”參数,仅仅有中心点与邻域其它八个点的像素值之差在 %(-t,+t)之间,才确认它们为类似点,类似点不在候选角点之列 t=20; %我并没有所有检測图像每一个点,而是除去了边界上boundary个像素, %由于我们感兴趣的角点并不出如今边界上 boundary=8; for i=boundary:nrow-boundary+1 for j=boundary:ncol-boundary+1 nlike=0; %类似点个数 if Image(i-1,j-1)>Image(i,j)-t && Image(i-1,j-1)<Image(i,j)+t nlike=nlike+1; end if Image(i-1,j)>Image(i,j)-t && Image(i-1,j)<Image(i,j)+t nlike=nlike+1; end if Image(i-1,j+1)>Image(i,j)-t && Image(i-1,j+1)<Image(i,j)+t nlike=nlike+1; end if Image(i,j-1)>Image(i,j)-t && Image(i,j-1)<Image(i,j)+t nlike=nlike+1; end if Image(i,j+1)>Image(i,j)-t && Image(i,j+1)<Image(i,j)+t nlike=nlike+1; end if Image(i+1,j-1)>Image(i,j)-t && Image(i+1,j-1)<Image(i,j)+t nlike=nlike+1; end if Image(i+1,j)>Image(i,j)-t && Image(i+1,j)<Image(i,j)+t nlike=nlike+1; end if Image(i+1,j+1)>Image(i,j)-t && Image(i+1,j+1)<Image(i,j)+t nlike=nlike+1; end if nlike>=2 && nlike<=6 Corner(i,j)=1;%假设周围有0,1,7,8个类似与中心的(i,j) %那(i,j)就不是角点,所以,直接忽略 end; end; end; CRF = zeros(nrow,ncol); % CRF用来保存角点响应函数值,初值全零 CRFmax = 0; % 图像中角点响应函数的最大值,作阈值之用 t=0.05; % 计算CRF %project上经常使用CRF(i,j) =det(M)/trace(M)计算CRF,那么此时应该将以下第105行的 %比例系数t设置大一些,t=0.1对採集的这几幅图像来说是一个比較合理的经验值 for i = boundary:nrow-boundary+1 for j = boundary:ncol-boundary+1 if Corner(i,j)==1 %仅仅关注候选点 M = [A(i,j) C(i,j); C(i,j) B(i,j)]; CRF(i,j) = det(M)-t*(trace(M))^2; if CRF(i,j) > CRFmax CRFmax = CRF(i,j); end; end end; end; %CRFmax count = 0; % 用来记录角点的个数 t=0.01; % 以下通过一个3*3的窗体来推断当前位置是否为角点 for i = boundary:nrow-boundary+1 for j = boundary:ncol-boundary+1 if Corner(i,j)==1 %仅仅关注候选点的八邻域 if CRF(i,j) > t*CRFmax && CRF(i,j) >CRF(i-1,j-1) ...... && CRF(i,j) > CRF(i-1,j) && CRF(i,j) > CRF(i-1,j+1) ...... && CRF(i,j) > CRF(i,j-1) && CRF(i,j) > CRF(i,j+1) ...... && CRF(i,j) > CRF(i+1,j-1) && CRF(i,j) > CRF(i+1,j)...... && CRF(i,j) > CRF(i+1,j+1) count=count+1;%这个是角点,count加1 else % 假设当前位置(i,j)不是角点,则在Corner(i,j)中删除对该候选角点的记录 Corner(i,j) = 0; end; end; end; end; % disp('角点个数'); % disp(count) figure,imshow(Image); % display Intensity Image hold on; % toc(t1) for i=boundary:nrow-boundary+1 for j=boundary:ncol-boundary+1 column_ave=0; row_ave=0; k=0; if Corner(i,j)==1 for x=i-3:i+3 %7*7邻域 for y=j-3:j+3 if Corner(x,y)==1 % 用算数平均数作为角点坐标,假设改用几何平均数求点的平均坐标,对角点的提取意义不大 row_ave=row_ave+x; column_ave=column_ave+y; k=k+1; end end end end if k>0 %周围不止一个角点 plot( column_ave/k,row_ave/k ,'g.'); end end; end; %end