Canny算法介紹 五步 in cv::Canny 高斯模糊 - GaussianBlur 灰度轉換 - cvtColor 計算梯度 – Sobel/Scharr 非最大信號抑制 高低閾值輸出二值圖像 Canny算法介紹-高低閾值輸出二值圖像 T1, T2為閾值, 凡是高於T2的都保留, 凡是小於T1都丟棄, 從高於T2的像素出發,凡是大於T1而且相互連接的,都保留。 最終得到一個輸出二值圖像。 推薦的高低閾值比值為 T2: T1 = 3:1/2:1其中T2為高閾值,T1為低閾值
Canny( InputArray src, // 8-bit的輸入圖像 OutputArray edges, // 輸出邊緣圖像, 一般都是二值圖像,背景是黑色 double threshold1, // 低閾值,常取高閾值的1/2或者1/3 double threshold2, // 高閾值 int aptertureSize, // Soble算子的size,通常3x3,取值3 bool L2gradient // 選擇 true表示是L2來歸一化,否則用L1歸一化, 默認情況一般選擇是L1,參數設置為false
)
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(STRPAHT2); if (!src.data) { printf("could not load image...\n"); return -1; } 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); imshow(OUTPUT_TITLE, ~edge_output); }

