热点推荐

查看: 1804|回复: 0
收起左侧

[资料] 图像变换 - Canny算子边缘检测(cvCanny)

[复制链接]
  • TA的每日心情
    萌萌
    前天 21:05
  • 签到天数: 328 天

    连续签到: 3 天

    [LV.8]以坛为家I

    88

    主题

    378

    帖子

    2148

    积分

    Rank: 9

    积分
    2148

    热心会员突出贡献优质会员最佳新人

    发表于 2016-11-16 16:38:56 | 显示全部楼层 |阅读模式

    51Halcon诚邀您的加入,专注于机器视觉开发与应用技术,我们一直都在努力!

    您需要 登录 才可以下载或查看,没有帐号?会员注册

    x
    本帖最后由 IronMan 于 2016-11-16 16:41 编辑

    Canny是常用的边缘检测方法,其特点是试图将独立边的候选像素拼装成轮廓。
    (参考:摘自网络)

    John Canny于1986年提出Canny算子,它与Marr(LoG)边缘检测方法类似,也属于是先平滑后求导数的方法。
    John Canny研究了最优边缘检测方法所需的特性,给出了评价边缘检测性能优劣的三个指标:
    1.好的信噪比,即将非边缘点判定为边缘点的概率要低,将边缘点判为非边缘点的概率要低;
    2.高的定位性能,即检测出的边缘点要尽可能在实际边缘的中心;
    3. 对单一边缘仅有唯一响应,即单个边缘产生多个响应的概率要低,并且虚假响应边缘应该得到最大抑制。
    用一句话说,就是希望在提高对景物边缘的敏感性的同时,可以抑制噪声的方法才是好的边缘提取方法。
    Canny算子求边缘点具体算法步骤如下:
    1. 用高斯滤波器平滑图像.
    2. 用一阶偏导有限差分计算梯度幅值和方向.
    3. 对梯度幅值进行非极大值抑制 .
    4. 用双阈值算法检测和连接边缘
    -----------------------------具体参考博客
    以及

    -------------------------------------------------------------------------------------------------------
    Canny算子格式如下:
    Canny
    采用 Canny 算法做边缘检测
    void cvCanny( const CvArr* image, CvArr* edges, double threshold1, double threshold2, int aperture_size=3 );image单通道输入图像.edges单通道存储边缘的输出图像threshold1第一个阈值threshold2第二个阈值aperture_sizeSobel 算子内核大小 (见 cvSobel).
    函数 cvCanny 采用 CANNY 算法发现输入图像的边缘而且在输出图像中标识这些边缘。threshold1和threshold2 当中的小阈值用来控制边缘连接,大的阈值用来控制强边缘的初始分割。



    /*code*/
    注意:cvCanny只接受单通道图像作为输入,因此cvLoadImage的第二给参数表示是否加载有颜色的图像,因设为0,表示单通道图像,故src = cvLoadImage( argv[1], 0 );
    否则会出现编译错误,会提示canny.cpp不合法。

    1. #include <highgui.h>  
    2. #include <cv.h>  
    3. #include <cxcore.h>  //人脸识别的一个库文件  
    4.   
    5. //Canny:Implements Canny algorithm for edge detection.  
    6. int main( int argc, char** argv )  
    7. {  
    8.     IplImage* src = NULL;  
    9.     IplImage* dst = NULL;  
    10.       
    11.     //载入图像,转换为灰度图  
    12.     src = cvLoadImage( argv[1], 0 );   
    13.     //为canny边缘图像申请空间,1表示单通道灰度图  
    14.     dst = cvCreateImage( cvGetSize( src ), IPL_DEPTH_8U, 1 );   
    15.     cvCanny( src, dst, 50, 150, 3 );//边缘检测  
    16.     cvNamedWindow( "src", 1 );  
    17.     cvNamedWindow( "canny", 1 );  
    18.     cvShowImage( "src", src );  
    19.     cvShowImage( "canny", dst );  
    20.     cvWaitKey(0);  
    21.   
    22.     cvReleaseImage( &src );  
    23.     cvReleaseImage( &dst );  
    24.     cvDestroyAllWindows();  
    25.     return 0;  
    26.   
    27. }  
    复制代码
    -------------------------------------------------------------------------------------------------------

    /*result*/


    src 0_1318749729mm3S.gif
    canny 0_1318749762eME9.gif

    由此看出,canny算法得到的轮廓比较清新。

    转自:http://blog.csdn.net/hitwengqi/article/details/6877864
    您需要登录后才可以回帖 会员登录 | 会员注册

    本版积分规则

    经营性网站备案信息 经营性网站
    备案信息

    中国互联网举报中心 中国互联网
    举报中心

    中国文明网传播文明 中国文明网
    传播文明

    诚信网站

    深圳市市场监督管理局企业主体身份公示 工商网监
    电子标识