我是靠谱客的博主 壮观小笼包,这篇文章主要介绍OpenCV3之——边缘检测Canny算子的高阶用法,现在分享给大家,希望可以做个参考。

一、canny算子:

              Canny的目标是找到一个最优的边缘检测算法,评判标准:低错误率、高定位性、最小响应

二、canny边缘检测的步骤:

  1. 消除噪声,一般情况下,使用高斯平滑滤波器卷积降噪
  2. 计算梯度幅值和方向
  3. 非极大值抑制,这一步排除非边缘像素,仅仅保留了一些细线条(候选边缘)
  4. 滞后阈值

               <1>若某一像素位置的幅值超过高阈值,该像素被保留为边缘像素

               <2>若某一像素位置的幅值小于低阈值,该像素被排除

               <3>若某一像素位置的幅值在两者之间,该像素仅仅在连接到一个高于高阈值的时候被保留

三、Canny函数

函数原型:

复制代码
1
2
3
4
5
6
C++: void Canny(InputArray image, OutputArray edges, double threshold1, double threshold2, int apertureSize=3, bool L2gradient=false)

参数详解:

  • 第一个参数,InputArray类型的image,输入图像,填Mat类对象即可,且需为单通道8位图像
  • 第二个参数,OutputArray类型的edges,输出边缘图,和源图像有一样的尺寸和类型
  • 第三个参数,double类型的threshold1,第一个滞后性阈值
  • 第四个参数,double类型的threshold2,第二个滞后性阈值
  • 第五个参数,int类型的apertureSize,表示应用Sobel算子的孔径大小,默认值3
  • 第六个参数,bool类型的L2gradient,一个计算图像梯度幅值的标识,默认值false

注意:两个阈值中较小的值用于边缘连接,较大的值用来控制强边缘的初始段,推荐高低阈值比为2:1到3:1之间

四、示例:Canny边缘检测

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
#include <opencv2/opencv.hpp> using namespace std; using namespace cv; int main() { Mat src = imread("1.jpg"); Mat src1 = src.clone(); //显示原始图 imshow("【原始图】Canny边缘检测", src); //高阶canny用法,转成灰度图,降噪,用canny,最后将得到的边缘作为掩码,拷贝原图到效果图上,得到彩色的边缘图 Mat dst, edge, gray; //创建与src同类型和大小的矩阵dst dst.create(src1.size(), src1.type()); //将原图转化为灰度图 cvtColor(src1, gray, COLOR_RGB2GRAY); //先用3×3内核来降噪 blur(gray, edge, Size(3, 3)); //运行canny算子 Canny(edge, edge, 3, 9, 3);//推荐高低阈值比在2:1到3:1之间 //将dst内所有元素设置为0 dst = Scalar::all(0); //edge作为掩码,将原图src拷贝到dst中 src1.copyTo(dst, edge); imshow("【效果图】Canny边缘检测", dst); waitKey(0); return 0; }

运行结果:

 

最后

以上就是壮观小笼包最近收集整理的关于OpenCV3之——边缘检测Canny算子的高阶用法的全部内容,更多相关OpenCV3之——边缘检测Canny算子内容请搜索靠谱客的其他文章。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(70)

评论列表共有 0 条评论

立即
投稿
返回
顶部