本文由@浅墨_毛星云 出品, 文章链接: http://blog.csdn.net/poem_qianmo/article/details/25560901
今天跟他学习OpenCV中边缘检测的各种算子和滤波器——Canny算子,Sobel算子,Laplace算子以及Scharr滤波器。
理论知识如下思维导图:
一、关于边缘检测的基础知识:
二、canny算子篇
canny函数的示例代码如下:
#include<opencv2\core\core.hpp>
#include<opencv2\highgui\highgui.hpp>
#include<opencv2\imgproc\imgproc.hpp>
using namespace cv;
using namespace std;
Mat src,dst1,dst2;
//执行canny检测方法1
void canny_do1()
{
dst1=src.clone();
//拿到原图后直接执行canny函数
Canny(src,dst1,200,100,3);
if(!dst1.empty())
{
imshow("canny边缘检测1",dst1);
}
}
//执行高阶canny检测
void canny_do2()
{
Mat gray,edge;
//高阶canny用法,转成灰度图,降噪,用canny,最后将得到的边缘掩码,
//拷贝原图到效果图上,得到彩色边缘图
//1.创建与src尺寸大小一样的矩阵,并初始化为0
dst2=Mat::zeros(src.size(),src.type());
//2.将图像转换为灰度图像
cvtColor(src,gray,CV_BGR2GRAY);
//3.先用3*3内核降噪
blur(gray,edge,Size(3,3));
//4.运行canny算子
Canny(edge,edge,3,9,3);
//5.直接输出canny边缘检测的边缘图edge
imshow("canny边缘检测2",edge);
//6.用canny检测后的边缘图做为掩码,将原图拷贝到目标图上,得到彩色边缘图dst2
src.copyTo(dst2,edge);
imshow("canny边缘检测3",dst2);
}
int main()
{
src=imread("img/canny.png");
imshow("原图",src);
//namedWindow("canny边缘检测1");可以省略不写imshow()直接展示
//namedWindow("canny边缘检测2");
canny_do1();
canny_do2();
waitKey(0);
return 0;
}
对应原图:
函数canny_do1()直接检测的边缘效果图: