精华内容
下载资源
问答
  • canny算法

    2017-09-22 19:43:00
    canny算法  Canny边缘检测算子是John F. Canny于 1986 年开发出来的一个多级边缘检测算法。更为重要的是 Canny 创立了边缘检测计算理论(Computational theory of edge detection)解释这项技术如何工作 Canny 算法...

    canny算法

      Canny边缘检测算子是John F. Canny于 1986 年开发出来的一个多级边缘检测算法。更为重要的是 Canny 创立了边缘检测计算理论(Computational theory of edge detection)解释这项技术如何工作
    Canny 算法的发展
      Canny 的目标是找到一个最优的边缘检测算法,最优边缘检测的含义是: (1)最优检测:算法能够尽可能多地标识出图像中的实际边缘,漏检真实边缘的概率和误检非边缘的概率都尽可能小;
      (2)最优定位准则:检测到的边缘点的位置距离实际边缘点的位置最近,或者是由于噪声影响引起检测出的边缘偏离物体的真实边缘的程度最小;
      (3)检测点与边缘点一一对应:算子检测的边缘点与实际边缘点应该是一一对应。
      为了满足这些要求 Canny 使用了变分法,这是一种寻找满足特定功能的函数的方法。最优检测使用四个指数函数项表示,但是它非常近似于高斯函数的一阶导数。
    Canny 算法的步骤
    降噪
      任何边缘检测算法都不可能在未经处理的原始数据上很好地工作,所以第一步是对原始数据与高斯 mask 作卷积,得到的图像与原始图像相比有些轻微的模糊(blurred)。这样,单独的一个像素噪声在经过高斯平滑的图像上变得几乎没有影响。
    寻找图像中的亮度梯度
      图像中的边缘可能会指向不同的方向,所以 Canny 算法使用 4 个 mask 检测水平、垂直以及对角线方向的边缘。原始图像与每个 mask 所作的卷积都存储起来。对于每个点我们都标识在这个点上的最大值以及生成的边缘的方向。这样我们就从原始图像生成了图像中每个点亮度梯度图以及亮度梯度的方向。
    在图像中跟踪边缘
      较高的亮度梯度比较有可能是边缘,但是没有一个确切的值来限定多大的亮度梯度是边缘多大又不是,所以 Canny 使用了滞后阈值。
      滞后阈值需要两个阈值——高阈值与低阈值。假设图像中的重要边缘都是连续的曲线,这样我们就可以跟踪给定曲线中模糊的部分,并且避免将没有组成曲线 的噪声像素当成边缘。所以我们从一个较大的阈值开始,这将标识出我们比较确信的真实边缘,使用前面导出的方向信息,我们从这些真正的边缘开始在图像中跟踪 整个的边缘。在跟踪的时候,我们使用一个较小的阈值,这样就可以跟踪曲线的模糊部分直到我们回到起点。
      一旦这个过程完成,我们就得到了一个二值图像,每点表示是否是一个边缘点。
      一个获得亚像素精度边缘的改进实现是在梯度方向检测二阶方向导数的过零点
      它在梯度方向的三阶方向导数满足符号条件
      其中 Lx, Ly ... Lyyy 表示用高斯核平滑原始图像得到的尺度空间表示 L计算得到的偏导数。用这种方法得到的边缘片断是连续曲线,这样就不需要另外的边缘跟踪改进。滞后阈值也可以用于亚像素边缘检测。
    参数
      Canny 算法包含许多可以调整的参数,它们将影响到算法的计算的时间与实效。
      高斯滤波器的 大小:第一步所有的平滑滤波器将会直接影响 Canny 算法的结果。较小的滤波器产生的模糊效果也较少,这样就可以检测较小、变化明显的细线。较大的滤波器产生的模糊效果也较多,将较大的一块图像区域涂成一个 特定点的颜色值。这样带来的结果就是对于检测较大、平滑的边缘更加有用,例如彩虹的边缘。阈值:使用两个阈值比使用一个阈值更加灵活,但是它还是有阈值存在的共性问题。设置的阈值过高,可能会漏掉重要信息;阈值过低,将会把枝节信息看得很重要。很难给出一个适用于所有图像的通用阈值。目前还没有一个经过验证的实现方法。
    OpenCV中的Canny函数
      采用 Canny 算法做边缘检测
      void cvCanny( const CvArr* image, CvArr* edges, double threshold1,double threshold2, int aperture_size=3 );
      --image 输入图像.
      --edges 输出的边缘图像
      --threshold1 第一个阈值
      --threshold2 第二个阈值
      --aperture_size Sobel 算子内核大小 (见 cvSobel).
      函数 cvCanny 采用 CANNY 算法发现输入图像的边缘而且在输出图像中标识这些边缘。threshold1和threshold2 当中的小阈值用来控制边缘连接,大的阈值用来控制强边缘的初始分割。

    转载于:https://www.cnblogs.com/chucks123/p/7576806.html

    展开全文
  • Canny算法

    2021-07-01 12:53:53
    Canny算法 图像的边缘检测算法 前段时间通过《OpenCV 4 快速入门》一书学习opencv,在漫长的学习过程中,我获知了很多opencv的知识,在此特别感谢《OpenCV 4 快速入门》作者和csdn上的一些博主。今天,我想和大家...

    Canny算法

    图像的边缘检测算法

    前段时间通过《OpenCV 4 快速入门》一书学习opencv,在漫长的学习过程中,我获知了很多opencv的知识,在此特别感谢《OpenCV 4 快速入门》作者和csdn上的一些博主。今天,我想和大家简单聊一聊非常强悍的图像边缘检测算法Canny

    参考文献:canny算法_百度百科 (baidu.com)《OpenCV 4 快速入门》canny算法原理_jialeheyeshu的博客-CSDN博客_canny算子的原理

    1. Canny算法 简介:

      Canny算子 是 John F. Canny 于 1986 年开发出来的一个多级边缘检测算法。更为重要的是 Canny 创立了边缘检测计算理论 解释这项技术如何工作。

      Canny算法 不容易受到噪声的影响,能够识别图像中的弱边缘和强边缘,并结合强弱边缘的位置关系,综合给出图像整体的边缘信息。Canny边缘检测算法 是目前最优越的边缘检测算法之一。

    2. Canny算法 步骤:

      ① 图像滤波降噪:

      ​ 图像滤波降噪操作可谓是所有边缘检测算法的必备第一步,在Canny算法 中也不例外:使用高斯滤波平滑图像,减少图像噪声。


      ② 像素梯度计算:

      ​ 根据高等数学知识可知,梯度方向即方向导数取最大值的方向,而图像的边缘指的是图像中像素灰度值函数的导函数取最大值的区域,二者相互对应。因此,Canny算法 通过Sobel算子 分别检测图像 X 方向和 Y 方向的边缘,检测到边缘后,我们会发现表示边缘区域的线条通常会很粗,难以标定边缘的确切位置,故而还应该记录梯度的方向。总而言之,在像素梯度计算时,我们应当记录两份数据:一是梯度的大小,二是梯度的方向。以下分别展示梯度的大小和方向计算公式 以及X方向一阶Sobel边缘检测算子 (图10-12 b)和 Y方向一阶Sobel边缘检测算子 (图10-12 a)

      G = s q r t ( G x 2 + G y 2 ) G=sqrt(Gx^2 + Gy^2) G=sqrt(Gx2+Gy2)

      θ = a r c t a n ( G y / G x ) θ=arctan(Gy/Gx) θ=arctan(Gy/Gx)

    图10-12


    ​ ③ 消除杂散响应:

    ​ 图像梯度幅值矩阵中的元素值越大,只能说明图像中该点的梯度值越大,但这并不能说明该点就是边缘。因此,Canny算法 运用第 ②步所得的梯度方向,将当前像素的梯度大小与沿正负梯度方向上的两个像素进行比较,如果当前像素的梯度大于另外两个像素的梯度 ,就将该像素点保留为边缘点,否则该像素点将被抑制。

    ​ 以上内容可能会比较抽象,我当时学习的过程中也有些困惑,下面分享一位大佬的理解:

    canny算法原理_jialeheyeshu的博客-CSDN博客_canny算子的原理

    http://hi.csdn.net/attachment/201110/20/0_1319119291xBLz.gif
    

    根据图1(可由上一个链接查看)可知,要进行非极大值抑制,就首先要确定像素点C的灰度值在其8值邻域内是否为最大。图1中蓝色的线条方向为C点的梯度方向,这样就可以确定其局部的最大值肯定分布在这条线上,也即出了C点外,梯度方向的交点dTmp1和dTmp2这两个点的值也可能会是局部最大值。因此,判断C点灰度与这两个点灰度大小即可判断C点是否为其邻域内的局部最大灰度点。如果经过判断,C点灰度值小于这两个点中的任一个,那就说明C点不是局部极大值,那么则可以排除C点为边缘。这就是非极大值抑制的工作原理。

    ​ 总而言之,我认为非极大值抑制算法就是一种选择算法,选择的标准是:像素灰度值是否为局部最大值,若为局部最大值,则保留该边缘点,否则将其像素灰度值置为0,即将其抑制。


    ​ ④ 划分强弱边缘:

    ​ 在实际操作的过程中,我们会发现经过非极大值抑制处理后的图像会存在噪声,Canny算法 运用双阈值法(即设定一个阈值上界和阈值下界),然后将边缘处的梯度值与两个阈值作比较,如果大于阈值上界则标记为强边缘,小于阈值下界则去除,两者之间的则标记为弱边缘,需要做进一步检测。


    ​ ⑤ 消除孤立弱边缘:

    ​ 在弱边缘的 8-领域 范围内寻找强边缘,能找到则保留该弱边缘,否则将删除该弱边缘。我认为:孤立弱边缘可能是一些未被消除的噪声点,或者是图像的一些孤立区域,这些边缘不具有提取价值,应当被消除。另外,补充 8-领域 的定义:点P(x,y)的 8-领域 共有8个像素点,分别是(x-1,y+1)、(x,y+1) 、(x+1,y+1)、(x-1,y)、(x+1,y)、(x-1,y-1)、(x,y-1)、(x+1,y-1)。

    1. 总结:

      以上就是身为CV入门小白的我对 Canny算法 的一些理解和归纳,如果有讲得不好的地方,欢迎各位大佬指导纠正。

    展开全文
  • canny 算法

    2018-08-28 14:53:06
    John Canny研究了最优边缘检测方法所需的特性,给出了评价边缘检测性能优劣的3个指标:   1 好的信噪比,即将非边缘点判定为边缘点的概率要低,将边缘点判为非边缘点的概率要低; 2 高的定位性能,即检测出的...

    John Canny研究了最优边缘检测方法所需的特性,给出了评价边缘检测性能优劣的3个指标:

     

    • 1  好的信噪比,即将非边缘点判定为边缘点的概率要低,将边缘点判为非边缘点的概率要低;
    • 2 高的定位性能,即检测出的边缘点要尽可能在实际边缘的中心;
    • 3 对单一边缘仅有唯一响应,即单个边缘产生多个响应的概率要低,并且虚假响应边缘应该得到最大抑制;
    • 边缘检测是基于对图像灰度差异运算实现的,所以如果输入的是RGB彩色图像,需要先进行灰度图的转换。

      RGB转换成灰度图像的一个常用公式是:

       

      Gray = R*0.299 + G*0.587 + B*0.114

    展开全文
  • canny算法实现

    2018-04-04 14:22:00
    该代码实现了CANNY算法的具体过程,但是与opencv的canny函数的结果比较有出入。
  • Canny 算法

    千次阅读 2015-04-25 15:24:21
    /***********************************************Canny算法实现过程*************************************************/ 分为以下几个步骤: 1、图像灰度化:只有灰度图才能进行边缘检测 2、去噪...
    

    本文转自:http://blog.csdn.net/black_small/article/details/9812905

    边缘检测是图像处理计算机视觉中的基本问题,边缘检测的目的是标识数字图像亮度变化明显的点。图像属性中的显著变化通常反映了属性的重要事件和变化。这些包括(i)深度上的不连续、(ii)表面方向不连续、(iii)物质属性变化和(iv)场景照明变化。 边缘检测是图像处理计算机视觉中,尤其是特征提取中的一个研究领域。

    图像边缘检测大幅度地减少了数据量,并且剔除了可以认为不相关的信息,保留了图像重要的结构属性。有许多方法用于边缘检测,它们的绝大部分可以划分为两类:基于查找一类和基于零穿越的一类。基于查找的方法通过寻找图像一阶导数中的最大和最小值来检测边界,通常是将边界定位在梯度最大的方向。基于零穿越的方法通过寻找图像二阶导数零穿越来寻找边界,通常是Laplacian过零点或者非线性差分表示的过零点。

    Canny 边缘检测算子是John F. Canny于 1986 年开发出来的一个多级边缘检测算法。更为重要的是 Canny 创立了边缘检测计(Computational theory of edge detection)解释这项技术如何工作。

    Canny 的目标是找到一个最优的边缘检测算法,最优边缘检测的含义是:

    • 好的检测 - 算法能够尽可能多地标识出图像中的实际边缘。
    • 好的定位 - 标识出的边缘要尽可能与实际图像中的实际边缘尽可能接近。
    • 最小响应 - 图像中的边缘只能标识一次,并且可能存在的图像噪声不应标识为边缘。

    为了满足这些要求 Canny 使用了变分法,这是一种寻找满足特定功能函数的方法。最优检测使用四个指数函数项的和表示,但是它非常近似于高斯函数的一阶导数

    /***********************************************Canny算法实现过程*************************************************/

    分为以下几个步骤:

    1、图像灰度化:只有灰度图才能进行边缘检测

    2、去噪:噪声点将影响边缘检测的准确性

    3、求解梯度幅度和方向:利用sobel算子求解

    4、非极大值抑制:定位准确的边缘同时可缩小边缘线宽

    5、双阀值算法检测及连接边缘


    1、图像灰度化

    Canny算法通常处理的图像为灰度图,因此如果摄像机获取的是彩色图像,那首先就得进行灰度化。对一幅彩色图进行灰度化,就是根据图像各个通道的采样值进行加权平均。以RGB格式的彩图为例,通常灰度化采用的方法主要有:

            方法1:Gray=(R+G+B)/3;

            方法2:Gray=0.299R+0.587G+0.114B;

    注意1:至于其他格式的彩色图像,可以根据相应的转换关系转为RGB然后再进行灰度化;

    注意2:在编程时要注意图像格式中RGB的顺序通常为BGR


    2、去噪

    噪声的存在影响到边缘的检测,首先将图片进行高斯去噪,高斯去噪其实就是一个低通滤波器,滤除高频噪声。

    3、求解梯度幅度和方向

    梯度的幅度及方向采用sobel算子求解,索贝尔算子(Sobel operator)是图像处理中的算子之一,主要用作边缘检测。在技术上,它是一离散性差分算子,用来运算图像亮度函数的梯度之近似值。在图像的任何一点使用此算子,将会产生对应的梯度矢量或是其法矢量。

    该算子包含两组3x3的矩阵,分别为横向及纵向,将之与图像作平面卷积,即可分别得出横向及纵向的亮度差分近似值。如果以\mathbf{A}代表原始图像,\mathbf{G_x}\mathbf{G_y}分别代表经横向及纵向边缘检测的图像,其公式如下:


    图像的每一个像素的横向及纵向梯度近似值可用以下的公式结合,来计算梯度的大小。


    然后可用以下公式计算梯度方向。


    在以上例子中,如果以上的角度\Theta等于零,即代表图像该处拥有纵向边缘,左方较右方暗。


    4、非极大值抑制

    在求出的幅值图像中,可能存在多个较大幅值临近的情况,但真正的边缘点只有一个,针对这样的情况我们进行非极大值抑制,找出局部最大值,从而可以剔除大部分非边缘点


    如上图所示,我们对每一像素点做如下处理:

    根据该像素点的梯度方向,确定需进行比较的临近像素点位置,如上图所示(过像素点方向为梯度方向的直线与该像素点临近的八像素点所组成的矩形,相交于dTmp1和dTmp2,根据g1,g2a和g3,g4估算出交点像素,如果该像素点均大于两交点像素则为极大值边缘点,否则为非边缘点


    5、双阀值算法检测及连接边缘

    1. 滞后阈值: 最后一步,Canny 使用了滞后阈值,滞后阈值需要两个阈值(高阈值和低阈值):

      1. 如果某一像素位置的幅值超过 高 阈值, 该像素被保留为边缘像素。
      2. 如果某一像素位置的幅值小于 低 阈值, 该像素被排除。
      3. 如果某一像素位置的幅值在两个阈值之间,该像素仅仅在连接到一个高于 高 阈值的像素时被保留。

      Canny 推荐的 高:低 阈值比在 2:1 到3:1之间。

    下面我们将看到基于opencv中的canny边缘算法的具体实现(opencv中已经实现了canny算法我们只需调用即可,具体实现可见源码):

    1. /************************************************** 
    2.  * C++ Canny:Canny边缘检测 
    3.  **************************************************/  
    4.   
    5. #include "stdafx.h"  
    6.   
    7. #include "cv.h"  
    8. #include "cxcore.h"  
    9. #include "highgui.h"  
    10.    
    11. using namespace cv;  
    12. using namespace std;  
    13.    
    14. int edgeThresh = 1;  
    15.    
    16. // 声明 原始图片,灰度图片,和 canny边缘图片  
    17. IplImage *image;  
    18. IplImage *gray, *edge;  
    19.    
    20. void onTrackbar(intvoid*)  
    21. {  
    22.     // 高斯滤波  
    23.     cvSmooth(gray, edge, CV_GAUSSIAN, 3, 3, 0 );  
    24.    
    25.     // Canny 边缘检测  
    26.     cvCanny(gray,edge, edgeThresh, edgeThresh*3, 3);  
    27.       
    28.     // 显示图片  
    29.     cvShowImage("Edge map", edge);  
    30. }  
    31.    
    32. int main()  
    33. {  
    34.    
    35.     // 载入图片  
    36.     image = cvLoadImage("E:\\test\\lenna.bmp");  
    37.    
    38.     // 判断载入图片是否成功  
    39.     if( image == NULL )  
    40.     {  
    41.         printf("miss the image file\n");  
    42.         return -1;  
    43.     }  
    44.    
    45.     // 生成灰度图片,因为只有灰度图片才能生成边缘图片  
    46.     gray = cvCreateImage( cvGetSize(image),IPL_DEPTH_8U ,1 );  
    47.     edge = cvCreateImage( cvGetSize(image),IPL_DEPTH_8U ,1 );  
    48.     cvCvtColor(image,gray, CV_BGR2GRAY);  
    49.    
    50.     // 新建一个窗口  
    51.     namedWindow("Edge map", 1);  
    52.    
    53.     // 生成一个进度条来控制边缘检测  
    54.     createTrackbar("Canny Threshold""Edge map", &edgeThresh, 100, onTrackbar);  
    55.    
    56.     // 初始化图像  
    57.     onTrackbar(0,0);  
    58.    
    59.     waitKey(0);  
    60.     cvReleaseImage( &image );  
    61.     cvReleaseImage( &edge );  
    62.     cvReleaseImage( &gray );  
    63.    
    64.     return 0;  
    65. }  

    展开全文
  • 简单的canny算法

    2018-10-20 19:11:01
    python canny算法
  • Canny算法详解

    2014-03-29 15:18:44
    Canny算法详解
  • canny 算法 源代码

    2018-05-05 20:06:48
    自己编写的canny算法 大家相互学习 ! 相互进步 ! 好东西要分享!
  • Canny算法的介绍,是有高斯滤波这一步的,看源代码找不到高斯滤波的部分。而且函数接口也没有滤波器的设置。,官方的例程好像也没有在调用Canny之前进行高斯滤波。
  • canny算法matlab

    2014-12-25 20:22:13
    canny算法,MATLAB实现,完全可以运行
  • Canny边缘检是在在1986年提出来的,到今天已经30多年过去了,但Canny算法仍然是图像边缘检测算法中最经典、先进的算法之一。 相比Sobel、Prewitt等算子,Canny算法更为优异。Sobel、Prewitt等算子有如下缺点: ...
  • 【OpenCV】Canny算法

    2020-02-25 09:34:53
    Canny算法
  • Canny算法.dox

    2016-05-14 20:45:47
    Canny算法.dox
  • Canny算法的各个步骤的详细代码与非常详细的注释,可以轻松的理解Canny边缘检测算法
  • OpenCV canny算法实现

    2019-04-15 17:27:39
    实现canny算法,包括自适应阈值、sobel算子生成、非极大值抑制、双阈值检测、弱边缘抑制 OpenCV版本:3.4.* vs版本 2015
  • canny算法边缘检测

    2013-04-14 09:54:17
    canny算法边缘检测C++代码实现过程
  • CANNY算法分析

    2014-04-21 22:39:26
    经过预处理等等的CANNY算法,经过线性灰度调整、均匀照度、中值滤波等预处理
  • Canny算法进行边缘探测
  • 基于MATLAB编译器,实现的canny算法,能够将算法的每一小步处理的图片都显示出来
  • matlab实现canny算法

    2012-04-14 21:15:43
    matlab实现canny算法
  • 边缘检测 Canny 算法的简单实现。 步骤/算法详情: 1. 高斯滤波器系数的卷积2. 用于水平和垂直方向的 Canny 滤波器卷积3.使用atan2计算方向4. 调整到最接近的 0、45、90 和 135 度5. 非最大抑制6. 迟滞阈值 输入图像...
  • opencv canny 算法实现

    2014-04-29 17:10:11
    opencv canny 算法实现 void on_trackbar(int threhold) { cvCanny(gsrcimage,gcannyimage,threhold,threhold*3,3); cvShowImage("canny",gcannyimage); } int _tmain(int argc, _TCHAR* argv[]) { gsrcimage=...
  • 针对目前散乱点云特征提取算法存在计算量大且不能规则化提取的问题,提出一种融合改进Canny算法的点云特征规则化提取算法。根据散乱点云的距离分辨率进行重采样,将点云进行规则栅格化;通过优化替代法对网格矩阵进行...
  • cvcanny 算法原理.

    2013-09-03 10:03:22
    详细解释了cvcanny 算法的原理,并附有VC实现的详细的代码
  • 该算法是matlab下的canny算法,并且对canny的结果进行填充,得到目标区域
  • 改代码是用于彩色图像边缘检测,主要用到Canny算法,高斯平滑滤波,非极大值抑制等方法
  • canny 算法和 hough 变换实现

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 11,281
精华内容 4,512
关键字:

canny算法