作者:翟天保Steven
版权声明:著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处

函数原型

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

参数说明

  1. InputArray类型的image,输入图像,8位图像。
  2. OutputArray类型的edges,输出边缘图,单通道 8 位图像,与 image 大小相同。
  3. double类型的threshold1,滞后过程的第一个阈值。
  4. double类型的threshold2,滞后过程的第二个阈值。
  5. int类型的apertureSize,算子的孔径大小。
  6. bool类型的L2gradient,若为ture则使用L2范数计算图像梯度幅度,若为false,则用L1范数。

函数原理

Canny边缘检测算法是一种多级边缘检测算法,也被很多人认为是边缘检测的最优算法。其目标是找到一个最优的边缘检测算法,用三个主要评价标准来表征是否为最优:

  1. 低错误率:标识出尽可能多的实际边缘,同时尽可能地减少噪声产生的误报;
  2. 高定位率:标识出的边缘要与图像中的实际边缘尽可能接近。
  3. 最小响应:图像中的边缘只能标识一次,并且可能存在的图像噪声不应标识为边缘。

为了满足上述标准,Canny使用了变分法,这是一种寻找满足特定功能的函数的方法。最优检测用4个指数函数项的和表示,其非常近似于高斯函数的一阶导数。

Canny边缘检测的步骤:

  1. 消除噪声,采用高斯平滑滤波器卷积降噪。
  2. 计算梯度幅值和方向。梯度方向一般取0、45、90、135中的一个。
  3. 非极大值抑制。这是为了排除非边缘像素,仅仅保留一些细线条,作为候选边缘。
  4. 滞后阈值。如参数列表所示,有两个阈值(高阈值和低阈值)。若某一像素位置的幅值超过高阈值,该像素被保留为边缘像素;若某一像素位置的幅值小于低阈值,该像素被排除;若处于两阈值之间,该像素仅仅在连接到一个高于高阈值的像素时被保留。

测试代码

#include <iostream>
#include <opencv2/opencv.hpp>using namespace std;
using namespace cv;void main()
{// 灰度Canny检测Mat src = imread("test.jpg", 0);Mat result;Canny(src, result, 100, 150, 3, true);// 高阶Canny用法,转灰度图,降噪,将得到的边缘作为掩码加到原图上,得到彩色的边缘图Mat src2 = imread("test.jpg");Mat edge, result2;result2=cv::Mat::zeros(src2.size(), src2.type());blur(src, edge, Size(5, 5));Canny(edge, edge, 3, 9, 3);src2.copyTo(result2, edge);// 结果显示imshow("src", src2);imshow("gray", result);imshow("color", result2);waitKey(0);system("pause");
}

测试效果

图1 原图

图2 灰度边缘图

图3 彩色边缘图

注意函数的两个阈值与边缘的识别息息相关。

如果文章帮助到你了,可以点个赞让我知道,我会很快乐~加油!

OpenCV-Canny边缘检测相关推荐

  1. OpenCV Canny边缘检测的实例(附完整代码)

    OpenCV Canny边缘检测的实例 OpenCV Canny边缘检测的实例 OpenCV Canny边缘检测的实例 #include "opencv2/core/utility.hpp& ...

  2. opencv Canny边缘检测用法

    <span style="color:#000080">1. cv2.Canny(image, threshold1, threshold2[, edges[, ape ...

  3. Python cv2(Opencv) Canny边缘检测 和 傅里叶变换

    简介: OpenCV是一个基于Apache2.0许可(开源)发行的跨平台计算机视觉和机器学习软件库,可以运行在Linux.Windows.Android和Mac OS操作系统上.它轻量级而且高效,由一 ...

  4. Python OpenCV -- Canny 边缘检测 (十一)

    Canny 边缘检测 原理 Canny 边缘检测算法 是 John F. Canny 于 1986年开发出来的一个多级边缘检测算法,也被很多人认为是边缘检测的 最优算法, 最优边缘检测的三个主要评价标 ...

  5. OpenCV Canny边缘检测

    Canny算法: 流程: 噪声去除:高斯滤波 计算图像梯度:sobel算子,计算梯度大小和方向 非极大值抑制:利用梯度方向像素来判断当前像素是否为边界点 滞后阈值:设置两个阈值,确定最终的边界 Can ...

  6. OpenCV——Canny边缘检测(cv2.Canny())

    Canny边缘检测 Canny 边缘检测是一种使用多级边缘检测算法检测边缘的方法.1986 年,John F. Canny 发 表了著名的论文 A Computational Approach to ...

  7. (九)OpenCV Canny边缘检测

    1.基础原理 参考自<数字图象处理>第十章 及OpenCV Tutorial Canny Edge Detector 1.1边缘检测概述 边缘检测是根据灰度突变来分割图像的一种常用方法.边 ...

  8. python+opencv Canny边缘检测

    Step1:高斯滤波(低通滤波,用高斯滤波器平滑图像) 卷积/卷积核(对应相乘再相加) 原始图片外围加一圈0,为保证新图片与原始图片大小相同 卷积核为3*3,外围补一圈0:卷积核为5*5,外围补两圈0 ...

  9. canny边缘检测 java_OpenCV Canny边缘检测

    本篇文章帮大家学习OpenCV Canny边缘检测,包含了OpenCV Canny边缘检测使用方法.操作技巧.实例演示和注意事项,有一定的学习价值,大家可以用来参考. Canny边缘检测用于检测图像中 ...

  10. OpenCV 笔记(03)— 读取视频、通过摄像头采集视频、采集视频 canny 边缘检测

    我们本节学习如何利用 OpenCV 中的 VideoCapture 类,来对视频进行读取显示,以及调用摄像头. VideoCapture 它提供了从摄像机或视频文件捕获视频的 C++ 接口, 作用是从 ...

最新文章

  1. 谈谈java面向对象思想_对于Java面向对象思想的理解
  2. Pandas 求余运算
  3. flume channel monitor实现源码分析
  4. 中国电信第三大IDC机房落户南海
  5. js中的4种函数调用模式:函数调用、方法调用、构造器调用、间接调用
  6. python in visual studio
  7. mysql的四大线程_阿里一面就凉了:MySQL+多线程+Redis+算法+网络一个都没说明白...
  8. dns遭到劫持_关于网站pr劫持的问题,PR劫持是如何实现的呢?
  9. 扩展频谱--直接序列扩频
  10. 软件立项申请报告模板
  11. IP地址配置错误网络无法连接怎么解决Win10?
  12. MySQL究竟是如何做到持久性的?
  13. Java 公历转农历,然后农历减一年(或者几天或者任意天),再把这个日期转成公历
  14. CrossWalk - Android 动态加载so库文件
  15. Java Web之Servlet的三大常用作用域对象及其使用方法
  16. 什么是EDI 855采购订单确认(POA)?
  17. java的英语单词发音_最长英文单词完整发音读完需要3.5个小时?
  18. matlab中一些特殊字符的表示方法(如摄氏度°,·),上标和下标的表示方法
  19. MacBook Pro选购需要注意哪些,Mac电脑选购建议
  20. 如何快速阅读别人的源代码

热门文章

  1. react native快速上手
  2. Docker镜像、容器的理解和使用方法
  3. 指针的指针指向指针数组的指针
  4. 快速计算--斐波那契数列
  5. git推送tag到远端服务器
  6. Django学习入门步骤 教程步骤 python
  7. cairo在Gecko上实现的路线图
  8. 微软VMM2008实战之P2V迁移攻略
  9. 14-1 获得初始页面内容
  10. php编码机器语言,机器语言使用的编码是