

雙閥值:
一般的邊緣檢測算法用一個閥值來濾除噪聲或顏色變化引起的小的梯度值,而保留大的梯度值。
Canny算法應用雙閥值,即一個高閥值和一個低閥值來區分邊緣像素。如果邊緣像素點梯度值大於高閥值,則被認為是強邊緣點。
如果邊緣梯度值小於高閥值,大於低閥值,則標記為弱邊緣點。小於低閥值的點則被抑制掉。這一步算法很簡單。



代碼如下:
#include <opencv2/opencv.hpp> #include <iostream> #include <math.h> using namespace cv; Mat src, gray_src, dst; int t1_value = 50; int max_value = 255; const char*OUTPUT_TITLE = "Canny Result"; void Canny_Demo(int, void*); int main(int argc, char** argv) { src = imread("L:/5.jpg"); if (!src.data) { printf("could not load image...\n"); return -1; } char INPUT_TITLE[] = "input image"; namedWindow(INPUT_TITLE, CV_WINDOW_AUTOSIZE); namedWindow(OUTPUT_TITLE, CV_WINDOW_AUTOSIZE); imshow(INPUT_TITLE, src); cvtColor(src, gray_src, CV_BGR2GRAY); createTrackbar("Threshold Value:", OUTPUT_TITLE, &t1_value, max_value, Canny_Demo); Canny_Demo(0, 0); waitKey(0); return 0; } void 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); //dst.create(src.size(), src.type()); //src.copyTo(dst, edge_output); imshow(OUTPUT_TITLE, edge_output); }
結果:


