【OpenCV】影像的變換(三)-Canny邊緣檢測

王大偉啊發表於2015-04-24

在上篇的博文中,我們重點討論了影像變換中的兩種典型邊緣檢測運算元,分別是Sobel運算元和Laplace運算元,並且給出了OpenCV中自帶函式cvSobel()和cvLaplace()。這篇博文中,將重點介紹一種常用的邊緣檢測運算元-Canny運算元。
關於Canny運算元的數學理論,在這篇博文中,我們將不做重點介紹,可以參閱以下的博文:
http://www.cnblogs.com/cfantaisie/archive/2011/06/05/2073168.html
總得說來,對影像進行Canny邊緣檢測的大致步驟:
1、用高斯濾波器進行影像平滑
2、用一階偏導的有限差分計算梯度的幅值和方向
3、對梯度幅值進行非極大值抑制
4、用雙閾值演算法檢測和連線邊緣

但是Canny運算元得到的邊緣並沒有將整個輪廓作為一個整體,只是檢測出了輪廓邊界的畫素,輪廓的問題,我們在以前的博文中也已經討論過,在這裡不做介紹。OpenCV中給出了函式cvCanny()來對影像進行邊緣檢測。

void cvCanny(
    const CvArr* img,//輸入影像,必須為灰度圖
    CvArr* edges,//輸出影像,其實也是灰度圖
    double  lowThresh,//下限閾值
    double  highThresh,//上限閾值
    int aperturesize=3//核心大小
)

下面給出個程式示例:

#include<iostream>
#include<opencv2/opencv.hpp>

using namespace std;
int main()
{
    const char *windows1 = "原圖";
    const char *windows2 = "Canny圖";
    IplImage *pSrcImage = cvLoadImage("3.jpg", CV_LOAD_IMAGE_GRAYSCALE);
    IplImage *pDstImage = cvCreateImage(cvGetSize(pSrcImage), IPL_DEPTH_8U, 1);

    cvCanny(pSrcImage, pDstImage, 50, 150, 3);

    cvNamedWindow(windows1, CV_WINDOW_AUTOSIZE);
    cvNamedWindow(windows2, CV_WINDOW_AUTOSIZE);
    cvShowImage(windows1,pSrcImage);
    cvShowImage(windows2, pDstImage);

    cvWaitKey();

    cvDestroyWindow(windows1);
    cvDestroyWindow(windows2);
    cvReleaseImage(&pSrcImage);
    cvReleaseImage(&pDstImage);


    return 0;
}

執行結果如下:
這裡寫圖片描述
這裡寫圖片描述

上述的程式中在呼叫cvCanny()函式的時候,我們將其中的引數threshold的值固定為50,其實為了更好的實現動態的引數canny邊緣檢測,可以呼叫cvCreateTrackbar()函式程式設計,不停的改變引數,觀察不同引數下的Canny邊緣檢測效果。下面給出這個程式的示例的部落格連結,大家感興趣的話,可以參閱下:
http://blog.csdn.net/morewindows/article/details/8239625/

相關文章