DOG算子--------的特征提取(二)

        DOG(Difference of Guassian)简称  高斯函数的差分,是灰度图像增强和角点检测的一种方法。

        

        (一)理论基础:

       下面详细介绍DOG的角点检测(也称特征点提取)的理论过程:

  通过将目标图像与高斯函数进行卷积运算得到一幅目标图像的低通滤波结果,此过程称为去燥。(注:这里的Gaussian和高斯低通滤波器的高斯是一个含义,即:正态分布函数)。

                                         公式(1) 正态分布函数

         在某一尺度上的特征检测可以通过两个相邻高斯尺度空间的图像相减,得到DOG的响应值图像。

         详细过程如下:

         首先 :对一幅图像f(x,y)进行不同参数的高斯滤波计算,表示如下

         其次:将滤波得到的结果g1(x,y和g2(x,y)相减得到:

        

          即:可以将DOG表示为:

                      公式(2) 函数的高斯差分函数

                        注:在具体的图像处理中,就是将两幅不同参数下的高斯滤波结果相减。得到DOG图

         最后:以此依据上述操作得到三个不同尺度下的DOG图,进而在三维空间中求角点。

 (二)实践步骤:

          在具体的图像处理中操作如下:

                    
              DOG算子--------的特征提取(二)_第1张图片

                                  图(1):原始图

       第一步:将同一图像在不同的参数下进行高斯滤波计算,并相减,得到三个DOG图,效果图如下    
    
              DOG算子--------的特征提取(二)_第2张图片
                     
                       图(2)   一个高斯平滑参数为0.3,另一个高斯平滑参数为0.4
          
              DOG算子--------的特征提取(二)_第3张图片
                
                               图(3)  一个高斯平滑参数为0.6,另一个高斯平滑参数为0.7
     
             DOG算子--------的特征提取(二)_第4张图片
             

                   图(4)  一个高斯平滑参数为0.7,另一个高斯平滑参数为0.8

           第二步:根据第一步求出的三张DOG   假设第一张图为f1(x,y),第二张图为f2(x,y),第三张图为f3(x,y);根据下面的模型,求出f2(x,y)(f2为中间标记红色的图)即中间)的最大值和最小值点。

          

          

     

        注:这里,一些童鞋们可以根据上面模型理解整个DOG特征提取的过程

      1:左边的四张图(包括原始图)是不同参数下高斯滤波结果的

      2:对高斯滤波后的图片(相邻状态下)依次进行两两相减可得到右边的三个高斯函数的差分图(简称DOG)。然后根据上面的模型,依次求中间图片每个像素与该像素同尺度的8个相邻点以及上下相邻尺度对应的9*2共26个点的极值。一个点如果在DOG空间本层以及上下两层的26个领域中是最大值和最小值时,就认为该点是图像在该尺度下的一个特征点。

      假设右边的三张图从上到下依次排列顺序为图f1,f2,f3。f2图中的红色标记为当前像素点,黄色对应的像素点表示其邻接的点公26个,如果该点是所有邻接像素点的最大值和最小值,则红色标记对应的点为特征点。如此可以求出所有f2图像中的所有极值点,即完成为了特征点提取。对应最大值标记为1,最小值标记为-1。如下图表示

          DOG算子--------的特征提取(二)_第5张图片

                  图(5)  f2中的所有极值点,黑色表示极小值,白色表示最大值


        最后,在原始图像上标记出所提取的DOG检测出的特征点。如下图所示;


         DOG算子--------的特征提取(二)_第6张图片

  

 下面是Matlab代码:

        注:test.png图与.m文件在同目录下。


clear all;
img = 'test.png';

Im = imread(img);
Im = rgb2gray(Im);
Im = double(Im);
s = 3;
k = 2^1/s;
x = 5;
sigma = 1.6 * k;
thresh = 3;

A = Process(Im, 0.3, 0.4, x);
B = Process(Im, 0.6, 0.7, x);
C = Process(Im, 0.7, 0.8, x);
D = Process(Im, 0.4, 0.5, x);

imshow(A, [0 1])

figure;

imshow(B, [0 1]);

figure;

imshow(C, [0,1]);

a = getExtrema(A, B, C, thresh);

figure;
imshow(a, [-1 1]);

drawExtrema(Im,a, [0 255])




你可能感兴趣的:(特征提取)