天天看點

Opencv-002 canny算子的了解

Opencv002-canny算子的了解

函數功能:采用Canny方法對圖像進行邊緣檢測

函數原型:

void cvCanny(

  const CvArr* image,

  CvArr* edges,

  double threshold1,double threshold2,

  int aperture_size=3

);

函數說明:

第一個參數表示輸入圖像,必須為單通道灰階圖。

第二個參數表示輸出的邊緣圖像,為單通道黑白圖。

第三個參數和第四個參數表示門檻值,這二個門檻值中當中的小門檻值用來控制邊緣連接配接,大的門檻值用來控制強邊緣的初始分割即如果一個像素的梯度大與上限值,則被認為是邊緣像素,如果小于下限門檻值,則被抛棄。如果該點的梯度在兩者之間則當這個點與高于上限值的像素點連接配接時我們才保留,否則删除。

第五個參數表示Sobel 算子大小,預設為3即表示一個3*3的矩陣。Sobel 算子與高斯拉普拉斯算子都是常用的邊緣算子,詳細的數學原理可以查閱專業書籍。

Opencv-002 canny算子的了解

注:4、邊緣隻有一個,用于産生邊緣 5、用于邊緣的連接配接

Opencv-002 canny算子的了解
Opencv-002 canny算子的了解

注:預設設為L1,為false

代碼:

cvtColor(src, gray_src, CV_BGR2RAY);

createTrackbar("Threshold Value:", OUTPUT_TITLE, &t1_value,max_value, Canny_Demo);    //在OUTPUT_TITLE中生成拖動視窗,用于調整t1_value的門檻值

Canny_Demo(0, 0);

Canny_Demo(int, void*)

{

    Mat edge_output;

    blur(gray_src, gray_src, Size(3, 3), Point(-1, -1), BORDER_DEFAULT);    //濾波,模糊掉噪聲

    Canny(gray_src, edge_output, t1_value, t1_value *2, 3, false);               //調用canny

    dst.create(src.size(), src.type());        //生成掩模

    Mat mask = Mat::zeros(src.size(), src.type());

    src.copyTo(dst, mask);

    imshow(OUTPUT_TITLE, dst);

}

參考:http://blog.csdn.net/morewindows/article/details/8239625