边缘检测系统原理:
使用一阶导数的极值或二阶导数的过零点来提取图像的边缘信息。
首先基于VS2010+OpenCV2.4.9环境编写程序,参考毛星云著《OpenCV3编程入门》
1.Canny边缘检测,代码如下:
#include <opencv2\opencv.hpp>
#include <opencv2\highgui\highgui.hpp>
#include <opencv2\imgproc\imgproc.hpp>
using namespace cv;
int main()
{
//载入原始图
Mat src = imread("Canny.jpg");
Mat src1 = src.clone();
//显示原始图
imshow("【原始图】Canny边缘检测", src);
Mat dst;
Mat edge;
Mat gray;
//1.创建与src同类型和大小的矩阵(dst)
dst.create(src1.size(), src1.type());
//2.将源图像转换为灰度图像
cvtColor(src1, gray, COLOR_BGR2GRAY);
//3.先使用3x3内核来降噪
blur(gray, edge, Size(3, 3));
//4.运行Canny算子
Canny(edge, edge, 3, 9, 3);
//5.将g_dstImage内所有元素设置为0
dst = Scalar::all(0);
//6.使用Canny算子输出边缘图g_cannyDetecteEdges作为掩码,来将原图g_srcImage拷贝到g_dstImage中
src1.copyTo(dst, edge);
//7.显示效果图
imshow("【效果图】Canny边缘检测2", dst);
waitKey(0);
return 0;
}
运行结果如下:
原始图片:
进行Canny算子边缘检测后得到效果图如下: