- Canny算法五步骤:Canny算法是边缘检测算法, 是一个很好的边缘检测器
- GaussianBlur去噪点
- 灰度转换cvtColor
- 计算像素梯度Sobel/Scharr
- 非最大值抑制(x\y方向上不是最大值的去掉)
- 高低阈值输出二值图像
- T1,T2为阈值, T2:T1 = 3:1 or 2:1, T2为高阈值, T1为低阈值
- >T2的像素,保留
- 若像素>T1且和>T2的像素相互连接, 则保留该像素
- Canny算法API
- Canny(src, edges, threshold1, threshold2, Size, L2gradient);
- 参数:原图片, 仅有边缘的图片, 低阈值, 高阈值, Sobel算子(计算梯度的算子)大小, L2gradient若为true,则用L2来归一化, false则L1归一化
- 注意:Canny()得到的是二值图像
#include "pch.h"
#include <iostream>
#include <opencv2/opencv.hpp>
#include <string>
using namespace std;
using namespace cv;
int t1 = 50;
int t2 = t1 * 2;
int max_value = 255;
void cannyCallback(int, void*);
Mat src, gray, bin, dst, canny;
int main(int argc, char ** argv)
{
src = imread("C:\\Users\\xujin\\Desktop\\test1.JPG");
if (!src.data)
{
cout << "no image";
return -1;
}
namedWindow("src_image", WINDOW_AUTOSIZE);
namedWindow("dst_image", WINDOW_AUTOSIZE);
namedWindow("dstGray_image", WINDOW_AUTOSIZE);
namedWindow("canny_image", WINDOW_AUTOSIZE);
imshow("src_image", src);
cvtColor(src, gray, COLOR_BGR2GRAY);
imshow("dstGray_image", gray);
createTrackbar("cannyT1T2", "canny_image", &t1, max_value, cannyCallback);
cannyCallback(0, 0);
waitKey(0);
return 0;
}
void cannyCallback(int, void*)
{
blur(gray, bin, Size(3, 3), Point(-1, -1), BORDER_DEFAULT);
Canny(bin, canny, t1,t2, 3, false);
imshow("canny_image", canny);
}