• Canny算子边缘检测(cvCanny)


    Canny是常用的边缘检测方法,其特点是试图将独立边的候选像素拼装成轮廓。

    (参考:摘自网络)

    John Canny于1986年提出Canny算子,它与Marr(LoG)边缘检测方法类似,也属于是先平滑后求导数的方法。

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

    1.好的信噪比,即将非边缘点判定为边缘点的概率要低,将边缘点判为非边缘点的概率要低;

    2.高的定位性能,即检测出的边缘点要尽可能在实际边缘的中心;

    3. 对单一边缘仅有唯一响应,即单个边缘产生多个响应的概率要低,并且虚假响应边缘应该得到最大抑制。

    用一句话说,就是希望在提高对景物边缘的敏感性的同时,可以抑制噪声的方法才是好的边缘提取方法。

    Canny算子求边缘点具体算法步骤如下:

    1. 用高斯滤波器平滑图像.

    2. 用一阶偏导有限差分计算梯度幅值和方向.

    3. 对梯度幅值进行非极大值抑制 .

    4. 用双阈值算法检测和连接边缘

    -----------------------------具体参考博客经典图像边缘检测 - Canny以及图象处理中的边缘检测 - canny算子

    -------------------------------------------------------------------------------------------------------

    Canny算子格式如下:

    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 当中的小阈值用来控制边缘连接,大的阈值用来控制强边缘的初始分割。

    -------------------------------------------------------------------------------------------------------

    /*code*/

    注意:cvCanny只接受单通道图像作为输入,因此cvLoadImage的第二给参数表示是否加载有颜色的图像,因设为0,表示单通道图像,故src = cvLoadImage( argv[1], 0 );

    否则会出现编译错误,会提示canny.cpp不合法。

    #include <highgui.h>
    #include <cv.h>
    #include <cxcore.h>  //人脸识别的一个库文件
    
    //Canny:Implements Canny algorithm for edge detection.
    int main( int argc, char** argv )
    {
        IplImage* src = NULL;
        IplImage* dst = NULL;
        
        //载入图像,转换为灰度图
        src = cvLoadImage( argv[1], 0 );  
        //为canny边缘图像申请空间,1表示单通道灰度图
        dst = cvCreateImage( cvGetSize( src ), IPL_DEPTH_8U, 1 ); 
        cvCanny( src, dst, 50, 150, 3 );//边缘检测
        cvNamedWindow( "src", 1 );
        cvNamedWindow( "canny", 1 );
        cvShowImage( "src", src );
        cvShowImage( "canny", dst );
        cvWaitKey(0);
    
        cvReleaseImage( &src );
        cvReleaseImage( &dst );
        cvDestroyAllWindows();
        return 0;
    
    }
  • 相关阅读:
    Linux 上的数据可视化工具
    LINUX 暂停、继续进程
    77个常用Linux命令和工具
    必学100个常用linux命令大全
    Canny边缘检測算法原理及其VC实现具体解释(一)
    ACM POJ 2192 Zipper
    【实战】静默安装-oracle 11.2.0.3 on centos 5.10
    C++ 观察者模式样例
    access数据库:怎么直接从access里把数据里同样的文字替换成空字符&quot;&quot;
    垂死挣扎还是涅槃重生 -- Delphi XE5 公布会归来感想
  • 原文地址:https://www.cnblogs.com/yssongest/p/OPENCV.html
Copyright © 2020-2023  润新知