图像变换-基于OPENCV的边缘检测:Canny 算子
canny算法的步骤:
1、Gaussianblur
2、转换成灰度图片
3、计算梯度:soble
4、非最大信号值抑制:保留最大信号值。
5、高低阈值输出图像:高于高阈值的保留,低于低阈值的去掉,从高于高阈值的像素出发,凡是高于低阈值而且相互连接的,保留下来。
高低阈值比一般为2:1/3:1
OpenCV中Canny() 函数的API:
void Canny( InputArray _src, OutputArray _dst,
double low_thresh, double high_thresh,
int aperture_size, bool L2gradient )
第一个参数是 输入8_bits的图像
第二个参数是输出图像
第三个参数是低阈值
第四个参数是高阈值
第五个参数是soble算子的size,默认为3;
第六个参数默认为false,选择用L1归一化,true选择用L2归一化
L1:
L2:
代码:
#include<opencv.hpp>
#include<iostream>
using namespace std;
using namespace cv;
void canny_operation(int, void*);
int value = 50;
int maxValue = 255;
Mat gray,src, dst;
const char* OUTPUT = "canny result";
const char* output_win = "image";
int main(int argc, char* argv[])
{
src = imread("1.jpg");
if (src.empty())
{
cout << "could not load the image!" << endl;
}
namedWindow(output_win, CV_WINDOW_AUTOSIZE);
imshow(output_win, src);
namedWindow(OUTPUT, CV_WINDOW_AUTOSIZE);
cvtColor(src, gray, COLOR_BGR2GRAY);
//创建滑动条
createTrackbar("threshold", OUTPUT, &value, maxValue,canny_operation);
canny_operation(0, 0);
waitKey(0);
return 0;
}
void canny_operation(int, void*)
{
Mat edge;
blur(gray, gray, Size(3, 3), Point(-1, -1),BORDER_DEFAULT);
//canny边缘检测
Canny(gray, edge, value, value * 2, 3, false);
imshow(OUTPUT,edge);
}
原图:
结果图: