zoukankan      html  css  js  c++  java
  • 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
    


     

  • 相关阅读:
    结对-五子棋游戏-开发过程
    团队-象棋游戏-设计文档
    课后作业-阅读任务-阅读提问-4
    团队-及格成绩查询系统-项目总结
    11.29-构建之法:现代软件工程-阅读笔记
    软件工程课程总结
    团队-及格成绩查询系统-最终程序
    团队-象棋游戏-团队一阶段互评
    课后作业-阅读任务-阅读提问-3
    课后作业-阅读任务-阅读笔记-3
  • 原文地址:https://www.cnblogs.com/mfrbuaa/p/3764523.html
Copyright © 2011-2022 走看看