点击上方“小白学视觉”,选择“星标”公众号

重磅干货,第一时间送达

经过几个月的努力,小白终于完成了市面上第一本OpenCV 4入门书籍《OpenCV 4开发详解》。为了更让小伙伴更早的了解最新版的OpenCV 4,小白与出版社沟通,提前在公众号上连载部分内容,请持续关注小白。

本节中最后介绍的边缘检测算法是Canny算法,该算法不容易受到噪声的影响,能够识别图像中的弱边缘和强边缘,并结合强弱边缘的位置关系,综和给出图像整体的边缘信息。Canny边缘检测算法是目前最优越的边缘检测算法之一,该方法的检测过程分为以下5个步骤:

  • Step1:使用高斯滤波平滑图像,减少图像中噪声。一般情况下使用式(5.23)所示的5×5的高斯滤波器。

  • Step2:计算图像中每个像素的梯度方向和幅值。首先通过Sobel算子分别检测图像X方向的边缘和Y方向的边缘,之后利用式(5.24)计算梯度的方向和幅值。

为了简便,梯度方向常取值0°、45°、90°和135°这个四个角度之一。

  • Step3:应用非极大值抑制算法消除边缘检测带来的杂散响应。首先将当前像素的梯度强度与沿正负梯度方向上的两个像素进行比较, 如果当前像素的梯度强度与另外两个像素梯度强度相比最大,则该像素点保留为边缘点,否则该像素点将被抑制。

  • Step4:应用双阈值法划分强边缘和弱边缘。将边缘处的梯度值与两个阈值进行比较,如果某像素的梯度幅值小于较小的阈值,则会被去除掉;如果某像素的梯度幅值大于较小阈值但小于较大阈值,则将该像素标记为弱边缘;如果某像素的梯度幅值大于较大阈值,则将该像素标记为强边缘。

  • Step5:消除孤立的弱边缘。在弱边缘的8邻域范围寻找强边缘,如果8邻域内存在强边缘,则保留该弱边缘,否则将删除弱边缘,最终输出边缘检测结果。

Canny算法具有复杂的流程,然而在OpenCV 4中提供了Canny()函数用于实现Canny算法检测图像中的边缘,极大的简化了使用Canny算法提取边缘信息的过程。Canny()函数的函数原型在代码清单5-32中给出。

代码清单5-32 Canny()函数原型1.  void cv::Canny(InputArray  image,2.                    OutputArray  edges,3.                    double  threshold1,4.                    double  threshold2,5.                    int  apertureSize = 3,6.                    bool  L2gradient = false 7.                    )
  • image:输入图像,必须是CV_8U的单通道或者三通道图像。

  • edges:输出图像,与输入图像具有相同尺寸的单通道图像,且数据类型为CV_8U。

  • threshold1:第一个滞后阈值。

  • threshold2:第二个滞后阈值。

  • apertureSize:Sobel算子的直径。

  • L2gradient:计算图像梯度幅值方法的标志,幅值的两种计算方式如式(5.25)所示。

该函数利用Canny算法提取图像中的边缘信息。第一个参数是需要提取边缘的输入图像,目前只支持数据类型为CV_8U的图像,输入图像可以是灰度图像或者彩色图像。第二个参数是边缘检测结果的输出图像,图像是数据类型为为CV_8U的单通道灰度图像。函数第三个和第四个参数是Canny算法中用于区分强边缘和弱边缘的两个阈值,两个参数不区分较大阈值和较小阈值,函数会自动比较区分两个阈值的大小,不过一般情况下,较大阈值与较小阈值的比值在2:1到3:1之间。函数最后一个参数是计算梯度幅值方法的选择标志,无特殊需求的情况下,使用默认值即可。

为了更好的理解Canny()函数的使用方法,在代码清单5-33中给出了利用Canny()函数检测图像边缘的示例程序。程序中通过设置不同的阈值来比较阈值的大小对图像边缘检测效果的影响,程序的输出结果在图5-35给出。通过结果可以发现,较高的阈值会降低噪声信息对图像提取边缘结果的影响,但是同时也会减少结果中的边缘信息。同时程序中先对图像进行高斯模糊后再进行边缘检测,结果表明高斯模糊在边缘纹理较多的区域能减少边缘检测的结果,但是对纹理较少的区域影响较小。

代码清单5-33 myCanny.cpp利用Canny算法提取图像边缘1.  #include 2.  #include 3.  4.  using namespace cv;5.  using namespace std;6.  7.  int main()8.  {9.    //读取图像,黑白图像边缘检测结果较为明显10.    Mat img = imread("equalLena.png", IMREAD_ANYDEPTH);11.    if (img.empty())12.    {13.      cout << "请确认图像文件名称是否正确" << endl;14.      return -1;15.    }16.    Mat resultHigh, resultLow, resultG;17.  18.    //大阈值检测图像边缘19.    Canny(img, resultHigh, 100, 200, 3);20.  21.    //小阈值检测图像边缘22.    Canny(img, resultLow, 20, 40, 3);23.  24.    //高斯模糊后检测图像边缘25.    GaussianBlur(img, resultG, Size(3, 3), 5);26.    Canny(resultG, resultG, 100, 200, 3);27.  28.    //显示图像29.    imshow("resultHigh", resultHigh);30.    imshow("resultLow", resultLow);31.    imshow("resultG", resultG);32.    waitKey(0);33.    return 0;34.  }

图5-35 myCanny.cpp程序中图像提取边缘结果

从零学习OpenCV 4往期推荐

【从零学习OpenCV 4】Windows系统中安装OpenCV 4

【从零学习OpenCV 4】Ubuntu系统中安装OpenCV 4

【从零学习OpenCV 4】opencv_contrib扩展模块的安装

【从零学习OpenCV 4】Mat类介绍

【从零学习OpenCV 4】Mat类构造与赋值

【从零学习OpenCV 4】Mat类支持的运算

【从零学习OpenCV 4】这4种读取Mat类元素的的方法你都知道么?

【从零学习OpenCV 4】namedWindow函数&imshow函数的使用

【从零学习OpenCV 4】颜色模型与转换

【从零学习OpenCV 4】多通道分离与合并

【从零学习OpenCV 4】图像像素统计

【从零学习OpenCV 4】两图像间的像素操作

【从零学习OpenCV 4】图像二值化

【从零学习OpenCV 4】LUT查找表

【从零学习OpenCV 4】图像仿射变换

【从零学习OpenCV 4】图像透视变换

【从零学习OpenCV 4】极坐标变换

【从零学习OpenCV 4】绘制几何图形

【从零学习OpenCV 4】图像金字塔

【从零学习OpenCV 4】创建图像窗口滑动条

【从零学习OpenCV 4】鼠标响应

【从零学习OpenCV 4】图像直方图绘制

【从零学习OpenCV 4】直方图归一化

【从零学习OpenCV 4】直方图比较

【从零学习OpenCV 4】直方图均衡化

【从零学习OpenCV 4】直方图匹配

【从零学习OpenCV 4】图像卷积

【从零学习OpenCV 4】图像中添加椒盐噪声

【从零学习OpenCV 4】图像中添加高斯噪声

【从零学习OpenCV 4】均值滤波

【从零学习OpenCV 4】方框滤波

【从零学习OpenCV 4】高斯滤波

【从零学习OpenCV 4】双边滤波

【从零学习OpenCV 4】边缘检测原理

【从零学习OpenCV 4】Sobel算子

【从零学习OpenCV 4】Scharr算子

【从零学习OpenCV 4】Laplacian算子

……

经过几个月的努力,市面上第一本OpenCV 4入门书籍《OpenCV 4开发详解》将春节后由人民邮电出版社发行。如果小伙伴觉得内容有帮助,希望到时候多多支持!
关注小白的小伙伴可以提前看到书中的内容,我们创建了学习交流群,欢迎各位小伙伴添加小白微信加入交流群,添加小白时请备注“学习OpenCV 4”。

c#用canny算子做边缘提取_【从零学习OpenCV 4】Canny算法相关推荐

  1. c#用canny算子做边缘提取_【图像处理】边缘检测

    边缘检测 sobel sobel是最常见也是最常用的边缘检测算子.一般来说,当我们想要获取图像的边缘时,首先想到的就是像素值发生突变的位置,而如何用数学表达来刻画"突变",一个很好 ...

  2. c#用canny算子做边缘提取_机器视觉学习(三)边缘检测

    一.边缘检测 二.边缘检测流程 三.Canny边缘检测 前言 边缘检测是图像处理和计算机视觉中,尤其是特征提取中的一个研究领域.有许多方法用于边缘检测,它们的绝大部分可以划分为两类: 基于一阶导数 首 ...

  3. c#用canny算子做边缘提取_干货 | 边缘检测

    最近小可爱们有没有等我们的技术推等到望穿秋水啊?大家日思夜想的技术推来啦.今天我们来一起学习一下opencv里面一个重要方面:边缘检测. 01.什么是边缘检测 边缘检测是图像处理和计算机视觉中的基本问 ...

  4. canny算子的边缘提取算法

    canny算子边缘提取分为四个步骤 1.去噪: 利用高斯滤波对图像卷积进行去噪处理: 2.求梯度: 采用梯度滤波模板对图像进行卷积,求取图像X方向和Y方向的梯度,以及对应的夹角: 3.非极大值抑制: ...

  5. opencv4 c++ 提取图片中的白色区域_修正!【从零学习OpenCV 4】分割图像——分水岭法...

    点击上方"小白学视觉",选择"星标"公众号重磅干货,第一时间送达 经过几个月的努力,小白终于完成了市面上第一本OpenCV 4入门书籍<OpenCV 4开 ...

  6. opencv利用矩形框选中某一区域_【从零学习OpenCV】4Ubuntu系统中安装OpenCV 4

    经过几个月的努力,小白终于完成了市面上第一本OpenCV 4入门书籍<从零学习OpenCV 4>.为了更让小伙伴更早的了解最新版的OpenCV 4,小白与出版社沟通,提前在公众号上连载部分 ...

  7. 病虫害模型算法_基于深度学习的目标检测算法综述

    sigai 基于深度学习的目标检测算法综述 导言 目标检测的任务是找出图像中所有感兴趣的目标(物体),确定它们的位置和大小,是机器视觉领域的核心问题之一.由于各类物体有不同的外观,形状,姿态,加上成像 ...

  8. es6 数组排序_重读《学习JS数据结构与算法-第三版》- 第3章 数组 二

    定场诗 守法朝朝忧闷,强梁夜夜欢歌:损人利己骑马骡,正值公平挨饿:修桥补路瞎眼,杀人放火儿多:我到西天问我佛,佛说:我也没辙! 前言 读<学习JavaScript数据结构与算法>- 第3章 ...

  9. opencv canny源码解析_行人检测 基于 OpenCV 的人体检测

    原文链接 行人检测 基于 OpenCV 的人体检测 - 热分享​hotdog29.com 在 2019年8月1日 上张贴 由 hotdog发表回复 行人检测 基于 OpenCV 的人体检测 我们都知道 ...

  10. 人工智能python编程具体做什么_人工智能主要学习什么编程?

    展开全部 人工智能主要学习Python相关的编程.Python是一种解释型脚本语言,可以应用于人工智能.32313133353236313431303231363533e59b9ee7ad943133 ...

最新文章

  1. 我的第一个CCIE-ccie6961
  2. Mysql---之Mysqladmin修改账号密码方式
  3. 如何在C#中使用 ArrayPool,MemoryPool
  4. python 批量处理文件_python批量处理文件或文件夹
  5. 【机器学习】机器学习从零到掌握之七 -- 教你使用KNN进行手写数字识别
  6. 《从强盗资本家到慈善家》--转载自思维的乐园
  7. C#利用NPOI导出Excel
  8. 在布局空间标注的尺寸量不对_CAD解决布局标注尺寸不对问题 及快捷键混乱问题...
  9. R语言逻辑回归、ROC曲线和十折交叉验证
  10. 2020 cr节目源_2020最新直播源
  11. 五笔字典86版wubi拆字图编码查询
  12. Elasticsearch: 运用 Pinned query 来提高文档的排名 (7.5发行版新功能)
  13. 【学习react中遇到的坑:内存泄漏报错】
  14. String index out of range: -4 错误解析
  15. Unity中在Game窗口画线
  16. 转 《图说区块链》读书笔记(完整版)
  17. 隔膜阀行业调研报告 - 市场现状分析与发展前景预测(2021-2027年)
  18. 读书笔记:Classification Beats Regression: Counting of Cells from Greyscale Microscopic Images based on A
  19. python爬取猫眼top100电影,经典永远是经典
  20. CodeForces - 711B Chris and Magic Square

热门文章

  1. JS鼠标捕获DIV内选中的坐标和宽高
  2. autofac文档:适配器和装饰器
  3. windows2008安装DNS服务器
  4. 使用ExMerge工具管理Exchange用户邮箱。
  5. 8.软件架构设计:大型网站技术架构与业务架构融合之道 --- 高并发问题
  6. 55. 时间服务器 : NTP 服务器
  7. script片段在前导致对下文的html元素引用失效
  8. 演示Eclipse插件实现代码提示和补全
  9. 学习MyBatis之简单入门HelloWorld
  10. How-to: Do Statistical Analysis with Impala and R