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);
}