Canny算法
Canny是边缘检测算法,在1986年提出的。
是一个很好的边缘检测器
很常用也很实用的图像处理方法
Canny算法步骤
- 消除噪声:高斯模糊 - GaussianBlur
- 灰度转换 - cvtColor
- 计算梯度 – Sobel/Scharr
- 非最大信号抑制
- 高低阈值输出二值图像
API:
函数原型及参数
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归一化 )
代码案例:
#include<iostream> #include<math.h> #include<opencv2/opencv.hpp> #include<opencv2/highgui.hpp> #include <opencv2/highgui/highgui_c.h> using namespace std; using namespace cv; void Canny_demo(int, void*); Mat src, gray_src; int max_range = 255; int min_threshold = 20; int main() { // 读取图片 src = imread("./test2.jpg"); if (!src.data) { cout << "Could not load the image ...." << endl; return -1; } namedWindow("input_image", CV_WINDOW_AUTOSIZE); imshow("input_image", src); // 换为灰度图 cvtColor(src, gray_src, CV_BGR2GRAY); imshow("gray_iamge", gray_src); // 使用trackbar调整阈值 namedWindow("Output_window", CV_WINDOW_AUTOSIZE); createTrackbar("Canny_Tracker", "Output_window", &min_threshold, max_range, Canny_demo); Canny_demo(0, 0); waitKey(0); return 0; } void Canny_demo(int, void *) { Mat tmp_src, edge_output, dst; // 均值滤波 blur(gray_src, tmp_src, Size(3, 3), Point(-1, -1), BORDER_DEFAULT); Canny(tmp_src, edge_output, min_threshold, min_threshold * 2, 3, false); imshow("canny_image", edge_output); // 显示Canny二值化的图 Mat tmp_src2(src); dst.create(src.size(), src.type()); tmp_src2.copyTo(dst, edge_output); // 将边缘与原图片重叠显示 imshow("Output_window", dst); }