Canny边缘检测理解

作为图像边缘检测方式的一种,其的结果是单像素边缘。

在OpenCV图像库函数中,它的函数形式为:

void cvCanny( const CvArr* image,CvArr* edges,double threshold1,double threshold2, int aperture_size=3 );

参数说明:

image 表示输入的图像数据,单通道灰度图;

edges 表示输出的图像边缘数据信息;

threshold1与threshold2 表示两个阈值,大的阈值控制着边缘信息的分割,小的阈值控制着边缘信息的连接;

aperture_size 表示图像平滑的尺寸大小。

算法具体的流程可以如下:

1)输入图像的平滑处理。

2)计算图像的梯度信息。

3)计算图像的梯度幅值信息。

4)对梯度幅值进行非极大值抑制,具体算法思想在于观察当前点的梯度幅值与邻域关系的比较,若是最大的,那么此点为边缘点,若不是最大的,此点非边缘点。

      具体判断条件(假设gx、gy为X方向与Y方向的梯度值,gTmp当前点的梯度幅值,g1,g2,g3,g4分别为确定周围邻域哪几个像素点的梯度值)

     若abs(gy)>abs(gx) 表示Y方向梯度值大于X方向的梯度值,此时差值参数weight=abs(gx)/abs(gy)

           再者若gx*gy>0,那么g1,g2,g3,g4与当前点的关系为:

     

       

         再者若gx*gy<0,那么g1,g2,g3,g4与当前点的关系为:

      

   若abs(gy)>abs(gx) 表示Y方向梯度值大于X方向的梯度值,此时差值参数weight=abs(gy)/abs(gx)

         再者若gx*gy>0,那么g1,g2,g3,g4与当前点的关系为:

      

         再者若gx*gy<0,那么g1,g2,g3,g4与当前点的关系为:

     

      此时根据g1-g4差值处理,gTmp1=g1*weight+(1-weight)*g2;

                                                     gTmp2=g3*weight+(1-weight)*g4;

      如果当前点的gtmp>gTmp1&&gtmp>gTmp2,认为此点为边缘点,否则不是边缘点。

5)边缘点连接,具体算法。

     1. 高阈值确定;

         梯度幅值直方图量化。

        根据直方图个数占用像素的比例确定梯度幅值的高阈值。

     2. 低阈值确定;

       根据高阈值与高低阈值的比例确定低阈值。

    3. 边缘点追踪;

6)实验效果,以lina图像为例,边缘检测效果如下:

猜你喜欢

转载自blog.csdn.net/anan1205/article/details/8776812