• MATLAB Moravec算子


    这个算子算是图像历史上第一个特征点提取算法了,1977年提出的,很简单,拿来练手很合适。

    算法原理如下:

    1.选取一个合理的邻域遍历图像,这里是5*5邻域的。在邻域中依次计算,垂直,水平,对角与反对角四个相邻像素灰度的差的平方和,作为该邻域特征值。

    大致就是下面这个样子:

    公式:

    这里k是窗口的半径。

    2.从四个特征值中选最小的值作为该像素初次候选特征值。

    公式:

     

    3.设定一个阈值,将大于该阈值初次候选特征值的选为二次候选特征值。

    4.设定一个邻域,将该邻域最大的二次候选特征值作为最终要选择的特征值。

    原图:

    处理后:

    matlab代码如下:

     1 clear all;close all;clc
     2 
     3 img=double(imread('lena.jpg'));
     4 [h w]=size(img);
     5 imshow(img,[])
     6 
     7 imgn=zeros(h,w);
     8 n=4;
     9 for y=1+n:h-n
    10    for x=1+n:w-n
    11        sq=img(y-n:y+n,x-n:x+n);
    12        V=zeros(1,4);
    13        for i=2:2*n+1        %垂直,水平,对角,反对角四个方向领域灰度差的平方和
    14             V(1)=V(1)+(sq(i,n+1)-sq(i-1,n+1))^2;
    15             V(2)=V(2)+(sq(n+1,i)-sq(n+1,i-1))^2;
    16             V(3)=V(3)+(sq(i,i)-sq(i-1,i-1))^2;
    17             V(4)=V(4)+(sq(i,(2*n+1)-(i-1))-sq(i-1,(2*n+1)-(i-2)))^2;
    18        end
    19        pix=min(V);          %四个方向中选最小值
    20        imgn(y,x)=pix;      
    21    end
    22 end
    23 
    24 T=mean(imgn(:));        %设阈值,小于均值置零
    25 ind=find(imgn<T);
    26 imgn(ind)=0;
    27 
    28 for y=1+n:h-n           %选局部最大且非零值作为特征点
    29     for x=1+n:w-n
    30         sq=imgn(y-n:y+n,x-n:x+n);
    31         if max(sq(:))==imgn(y,x) && imgn(y,x)~=0
    32             img(y,x)=255;
    33         end
    34     end
    35 end
    36 
    37 figure;
    38 imshow(img,[]);

    算法整个过程还是很简单的,练习一下,顺便祭下这个特征值开山算法。

  • 相关阅读:
    ASP.NET结合COM组件发送Email
    木马生成技术
    AJAX中使用Session
    对象模型文档对象模型DOM简介
    何遍历数据源中的表名称
    AJAX.NET用户开发指南
    用ASP.NET上传大文件
    .net反编译利器
    Equals和GetHashcode
    Factory Method模式
  • 原文地址:https://www.cnblogs.com/ybqjymy/p/13645740.html
Copyright © 2020-2023  润新知