边缘检测的一般步骤

【第一步】滤波

边缘检测的算法主要是基于图像强度的一阶和二阶导数,但导数通常对噪声很敏感,因此必须采用滤波器来改善与噪声有关的边缘检测器的性能。常见的滤波方法主要有高斯滤波,即采用离散化的高斯函数产生一组归一化的高斯核,然后基于高斯核对图像灰度矩阵的每一点进行加权求和。

【第二步】增强

增强边缘的基础是确定图像各点邻域强度的变化值。增强算法可以将图像灰度点邻域强度值有显著变化的点凸显出来,在具体编程实现时,可通过计算梯度幅值来确定。

【第三步】检测

通过增强的图像,往往领域中有很多点的梯度值比较大,而在特定的应用中这些点并不是要找的边缘点,所以应该采用某种方法来对这些点进行取舍,实际工程中,常用的方法是通过阈值化方法来检测。

Canny 算子简介

Canny 边缘检测算子是 John F.Canny 于 1986 年开发出来的一个多级边缘检测算法。更为重要的是,Canny 创立了边缘检测计算理论,解释了这项技术是如何工作的。Canny 边缘检测算法以 Canny 的名字命名,被很多人推崇为最优的边缘检测的算法。

最优边缘检测的三个主要评价标准:

  • 低错误率:标识出尽可能多的实际边缘,同时尽可能地减少噪声产生的误差。
  • 高定位性:标识出的边缘要与图像中的实际边缘尽可能接近。
  • 最小相应:图像中的边缘只能标记一次,并且可能存在的图像噪声不应被识别为边缘。

Canny 边缘检测的步骤

【第一步】转化为灰度图并消除噪声

一般情况下,使用高斯平滑滤波器卷积降噪。下面显示了一个  的高斯内核示例:

【第二步】计算梯度幅值和方向

此处,按照 Sobel 滤波器的步骤来操作:

https://www.cnblogs.com/bjxqmy/p/12325852.html

① 运用一对卷积阵列 (分别作用于  和  方向)

② 使用下列公式计算梯度幅值和方向:

梯度方向近似到四个可能角度之一 —— 0 度, 45 度, 90 度, 135 度

【第三步】非极大值抑制

这一步排除非边缘像素,仅仅保留了一些细线条(候选边缘)。

① 将当前像素的边缘强度与正梯度方向和负梯度方向上的像素的边缘强度进行比较。
② 如果当前像素的边缘强度与具有相同方向的掩模中的其他像素相比是最大的(例如 y 方向的像素与其上方和下方的像素进行比较;x 方向的像素与其左方和右方的像素进行比较),该值将被保留。否则,该值将被抑制。

【第四步】滞后阈值

滞后阈值需要两个阈值:

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

② 若某一像素位置的幅值小于低阈值,该像素被排除。

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

Canny 边缘检测:Canny 函数

void Canny(InputArray image, OutputArray edges, double threshold1, double threshold2, int apertureSize = 3, bool L2gradient = false);

  • image,输入图像,即源图像,填 Mat 类对象即可,彩色或灰度图像均可,但一般为经过高斯模糊后的灰度图。
  • edges,输出的边缘图,和源图像有一样的尺寸,且为二值图像。
  • threshold1,第一个滞后性阈值。
  • threshold2,第二个滞后性阈值。
  • apertureSize,Sobel 算子的孔径大小,其有默认值 3。
  • L2gradient,一个计算图像梯度值幅度的标识,如果为 true,则使用更精确的 L2 范数进行计算(即某点梯度 = 两个方向导数的平方和再开方),默认为 false,使用 L1 范数(某点梯度 = 两个方向导数的绝对值相加)。

需要注意的是,函数阈值 1 和函数阈值 2 两者中较小的值用于边缘连接,而较大的值用来控制强边缘的初始段,推荐的高低阈值比在 2:1 到 3:1 之间。

代码示例:

#include<opencv.hpp>
using namespace cv;
int main() {
Mat src = imread("C:/Users/齐明洋/Desktop/证件照/7.jpg");
GaussianBlur(src, src, Size(, ), , );
imshow("src", src);
Mat gray, canny_img;
cvtColor(src, gray, COLOR_BGR2GRAY);
Canny(gray, canny_img, , , );
imshow("canny_img", canny_img); waitKey();
}

效果演示:

借鉴博客:https://www.cnblogs.com/pacino12134/p/9877971.html

openc —— Canny 边缘检测的更多相关文章

  1. Canny边缘检测

    1.Canny边缘检测基本原理      (1)图象边缘检测必须满足两个条件:一能有效地抑制噪声:二必须尽量精确确定边缘的位置.      (2)根据对信噪比与定位乘积进行测度,得到最优化逼近算子.这 ...

  2. OpenCV图像Canny边缘检测

    Canny边缘检测 图像的边缘检测的原理是检测出图像中所有灰度值变化较大的点,而且这些点连接起来就构成了若干线条,这些线条就可以称为图像的边缘函数原型:     void cvCanny(       ...

  3. OpenCV: Canny边缘检测算法原理及其VC实现详解(转载)

    原文地址:http://blog.csdn.net/likezhaobin/article/details/6892176 原文地址:http://blog.csdn.net/likezhaobin/ ...

  4. 从视频文件中读入数据-->将数据转换为灰度图-->对图像做canny边缘检测-->将这三个结构显示在一个图像中

    //从视频文件中读入数据-->将数据转换为灰度图-->对图像做canny边缘检测-->将这三个结构显示在一个图像中 //作者:sandy //时间:2015-10-10 #inclu ...

  5. [转载+原创]Emgu CV on C# (六) —— Emgu CV on Canny边缘检测

    Canny边缘检测也是一种边缘检测方法,本文介绍了Canny边缘检测的函数及其使用方法,并利用emgucv方法将轮廓检测解算的结果与原文进行比较. 图像的边缘检测的原理是检测出图像中所有灰度值变化较大 ...

  6. ###Canny边缘检测算子

    开源中国. #@date: 2014-06-20 #@author: gerui #@email: forgerui@gmail.com 一.一阶微分边缘算子 1. 一阶微分边缘检测算子也称梯度边缘算 ...

  7. openCV(四)---Canny边缘检测

    图像的边缘检测的原理是检测出图像中所有灰度值变化较大的点,而且这些点连接起来就构成了若干线条,这些线条就可以称为图像的边缘. 直接上代码,函数简介都在代码注释中 //canny边缘检测 -(void) ...

  8. Canny边缘检测算法的实现

    图像边缘信息主要集中在高频段,通常说图像锐化或检测边缘,实质就是高频滤波.我们知道微分运算是求信号的变化率,具有加强高频分量的作用.在空域运算中来说,对图像的锐化就是计算微分.由于数字图像的离散信号, ...

  9. 一些关于Canny边缘检测算法的改进

    传统的Canny边缘检测算法是一种有效而又相对简单的算法,可以得到很好的结果(可以参考上一篇Canny边缘检测算法的实现).但是Canny算法本身也有一些缺陷,可以有改进的地方. 1. Canny边缘 ...

随机推荐

  1. GitHub Pages 与 Gitee Pages 上的 Jekyll

    GitHub 与 Gitee 提供的 Pages 服务中,均内嵌了 Jekyll 支持(Gitee 还提供了 Hugo 与 Hexo 支持).所谓「支持」,即指这些生成工具挂在云端:你只需要提供原始代 ...

  2. nmap详解之选项说明

    功能选项 功能选项可以组合使用.一些功能选项只能够在某种扫描模式下使用.nmap会自动识别无效或者不支持的功能选项组合,并向用户发出警告信息. 如果你是有经验的用户,可以略过结尾的示例一节.可以使用n ...

  3. 今天更新IDEA后,我依旧要永久激活(支持2019.3.3版本)

    起因 今天一早用IDEA写代码,看到有下角有提示更新,有点强迫症的我,就手欠的又点了下更新,结果尼玛悲剧了,居然许可证过期,IDEA过期了,如下图所示: 就想用下新功能,就这样对我,就给两天的使用时间 ...

  4. 二、通过工厂方法来配置bean

    调用静态工厂方法创建 Bean是将对象创建的过程封装到静态方法中. 当客户端需要对象时, 只需要简单地调用静态方法, 而不同关心创建对象的细节. 要声明通过静态方法创建的 Bean, 需要在 Bean ...

  5. MCI使用

    MCI(Media Control Interface)媒体控制接口是MircroSoft提供的一组多媒体设备和文件的标准接口,它的好处是可以方便地控制绝大多数多媒体设备包括音频.视频.影碟.录像等多 ...

  6. python 使用记录

    #print输出后不换行 #python2.x 中末尾加逗号,表示不换行,print 'contents', #python3.x 中默认print('contents',end='\n'),想要输出 ...

  7. Open Images V4 下载自己需要的类别

    OpenImages V4数据集描述1)这个v4数据集主要有两种用途:对象检测及分类,意思是说可以用这个数据集训练出对象检测模型,用于识别图像中的对象类别及位置边框.视觉关系检测,比如你用这个v4数据 ...

  8. PTA 7-10 树的遍历(二叉树基础、层序遍历、STL初体验之queue)

    7-10 树的遍历(25 分) 给定一棵二叉树的后序遍历和中序遍历,请你输出其层序遍历的序列.这里假设键值都是互不相等的正整数. 输入格式: 输入第一行给出一个正整数N(≤30),是二叉树中结点的个数 ...

  9. (四)mybatis逆向工程

    构建 逆向工程就是说通过数据库当中的表生成class,mapper,接口,不需要自己编写那些,很方便.跟symfony里面的自动生成是一样的:视频里的人说用的不多,但我觉得很方便呀 具体步骤,首先导入 ...

  10. springboot结合Docker部署

    工程目录 创建Dockerfile FROM java VOLUME /tmp ADD springboot-docker-0.0.1-SNAPSHOT.jar app.jar RUN bash -c ...