Canny Detector 是一种针对快速实时边缘检测而优化的多阶段算法,该算法的基本目标是检测亮度(大梯度)的急剧变化,例如从白色到黑色的转换,在给定一组阈值的情况下将它们定义为边缘
opencv使用track bar 调整canny算子参数,提取到合适的图像边缘。
#include<iostream>
#include<opencv2/opencv.hpp>
using namespace cv;
void trackBar(int, void*);
int s1=0,s2=0;
Mat src, dst;
int main()
{
src = imread("E:/image/image/daibola.jpg");
if(src.empty())
{
printf("can not load image \n");
return -1;
}
cvNamedWindow("input", CV_WINDOW_AUTOSIZE);
imshow("input", src);
dst = src.clone();
cvNamedWindow("output", CV_WINDOW_AUTOSIZE);
createTrackbar("canny1", "output", &s1, 255, trackBar);
createTrackbar("canny2", "output", &s2, 255, trackBar);
GaussianBlur(src,src,Size(3,3),0);
waitKey();
return 0;
}
void trackBar(int, void*)
{
Canny(src,dst,s1,s2,3);
imshow("output", dst);
}
sobel算子是一种常用的边缘检测算子,是一阶的梯度算法。对噪声具有平滑作用,提供较为精确的边缘方向信息,边缘定位精度不够高。当对精度要求不是很高时,是一种较为常用的边缘检测方法。
opencv实现代码如下:
#include<opencv2/opencv.hpp>
#include<iostream>
#include<opencv2/highgui/highgui_c.h>
#include<vector>
#include<cstdlib>
using namespace cv;
using namespace std;
int main()
{
Mat src, dst;
src = imread("D://opencv//0.jpg");
if (src.empty())
{
printf("can not load image \n");
return -1;
}
dst = Mat::zeros(src.size(), src.type());
cvNamedWindow("input", CV_WINDOW_AUTOSIZE);
imshow("input", src);
Mat kernel = (Mat_<int>(2, 2) << 0, 1, -1, 0);
filter2D(src, dst, -1, kernel, Point(-1, -1), 0.0); //对图像做卷积
Mat xgrad, ygrad;
Sobel(src, xgrad, CV_16S, 1, 0);
Sobel(src, ygrad, CV_16S, 0, 1);
convertScaleAbs(xgrad, xgrad); //该操作可实现图像增强等相关操作的快速运算
convertScaleAbs(ygrad, ygrad);
addWeighted(xgrad, 0.5, ygrad, 0.5, 0, dst); //将两张相同大小,相同类型的图片融合的函数
//addWeighted(dst,0.5,src,1,0,dst);
cvNamedWindow("output", CV_WINDOW_AUTOSIZE);
imshow("output", dst);
waitKey();
return 0;
}
实现效果如下: