双阀值:
一般的边缘检测算法用一个阀值来滤除噪声或颜色变化引起的小的梯度值,而保留大的梯度值。
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... "); 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); }
结果: