没有合适的资源?快使用搜索试试~ 我知道了~
资源推荐
资源详情
资源评论
【OpenCV 新手教程之十二】OpenCV 边缘检測:Canny 算
子,Sobel 算子,Laplace 算子,Scharr 滤波器合辑
本系列文章由@浅墨_毛星云 出品,转载请注明出处。
文章链接:
http://blog.csdn.net/poem_qianmo/article/details/25560901
作者:毛星云(浅墨) 微博:http://weibo.com/u/1723155442
知乎:http://www.zhihu.com/people/mao-xing-yun 邮箱:
happylifemxy@163.com 写作当前博文时配套使用的
OpenCV 版本号:2.4.9 本篇文章中,我们将一起学习
OpenCV 中边缘检測的各种算子和滤波器——Canny 算
子,Sobel 算子,Laplace 算子以及 Scharr 滤波器。文章中包括
了五个浅墨为大家准备的具体凝视的博文配套源码。在介绍
四块知识点的时候分别一个,以及最后的综合演示样例中的
一个。文章末尾提供配套源码的下载。 依旧是是放出一
些程序执行截图吧: 效果图看完,我们来唠唠嗑。 首
先,须要说明的是,浅墨这篇文章最后的演示样例代码是採
用两周前刚刚公布的 2.4.9 来书写的。里面的 lib 都已经改成
了 2.4.9 版本号的。假设大家须要执行的话,要么配置好 2.4.9.
要么把浅墨在 project 中包括的末尾数字为 249 的各种 lib 改
成之前的 248 或者你相应的 OpenCV 版本号。 不然会提
示: LINK : fatal error LNK1181: 无法打开输入文件
“opencv_calib3d248.lib”之类的错误。 OpenCV 2.4.9 的
配置和之前的 2.4.8 差点儿相同,假设还是不太清楚,具体
能够參考浅墨改动过的相应 2.4.9 版的配置文章:
【OpenCV 新手教程之中的一个】 安装 OpenCV:OpenCV
2.4.8 或 2.4.9 +VS 开发环境配置 第二,给大家分享一个
OpenCV 中写代码时节约时间的小常识。事实上 OpenCV 中,
不用 namedWindow,直接 imshow 就能够显示出窗体。大家
看下文的演示样例代码就能够发现,浅墨在写代码的时候并
没实用 namedWindow,遇到想显示出来的 Mat 变量直接
imshow。我们通常是为了规范,才先用 namedWindow 创建
窗体,再 imshow 出它来,由于我们还有须要用到指定窗体
名称的地方,比方用到 trackbar 的时候。而普通情况想显示
一个 Mat 变量的图片的话,直接 imshow 就能够啦。 OK,
開始正文吧~ 一、关于边缘检測 在具体介绍之前,
先来一起看看边缘检測的一般步骤吧。(??此处强度应指图像
亮度强) 1)滤波:边缘检測的算法主要是基于图像强
度的一阶和二阶导数,但导数通常对噪声非常敏感,因此必
须採用滤波器来改善与噪声有关的边缘检測器的性能。常见
的滤波方法主要有高斯滤波,即採用离散化的高斯函数产生
一组归一化的高斯核(具体见“高斯滤波原理及其编程离散
化实现方法”一文),然后基于高斯核函数对图像灰度矩阵
的每一点进行加权求和(具体程序实现见下文)。 2)增
强:增强边缘的基础是确定图像各点邻域强度的变化值。增
强算法能够将图像灰度点邻域强度值有显著变化的点凸显
出来。在具体编程实现时,可通过计算梯度幅值来确定。
3)检測:经过增强的图像,往往邻域中有非常多点的梯度
值比較大,而在特定的应用中,这些点并非我们要找的边缘
点,所以应该採用某种方法来对这些点进行取舍。实际 project
中,经常使用的方法是通过阈值化方法来检測。 另外,
须要注意,下文中讲到的 Laplace 算子,sobel 算子和 Scharr
算子都是带方向的,所以,演示样例中我们分别写了 X 方向,Y
方向和终于合成的的效果图。 OK,正餐開始,召唤 canny
算子。:) 二、canny 算子篇 2.1 canny 算子相关理论
与概念解说 2.1.1 canny 算子简单介绍 Canny 边缘检
測算子是 John F.Canny 于 1986 年开发出来的一个多级边缘
检測算法。更为重要的是 Canny 创立了边缘检測计算理论
(Computational theory ofedge detection),解释了这项技术是
怎样工作的。Canny 边缘检測算法以 Canny 的名字命名,被
非常多人推崇为当今最优的边缘检測的算法。 当中,
Canny 的目标是找到一个最优的边缘检測算法,让我们看一
下最优边缘检測的三个主要评价标准: 1.低错误率: 标识
出尽可能多的实际边缘,同一时候尽可能的降低噪声产生的
误报。 2.高定位性: 标识出的边缘要与图像中的实际边
缘尽可能接近。 3.最小响应: 图像中的边缘仅仅能标识
一次,而且可能存在的图像噪声不应标识为边缘。 为了
满足这些要求 Canny 使用了变分法,这是一种寻找满足特
定功能的函数的方法。最优检測使用四个指数函数项的和表
示,可是它非常近似于高斯函数的一阶导数。 2.1.2 Canny
边缘检測的步骤 1.消除噪声。 普通情况下,使用高斯平
滑滤波器卷积降噪。 例如以下显示了一个 size = 5 的高斯
内核演示样例: 2.计算梯度幅值和方向。此处,依照 Sobel
滤波器的步骤。 Ⅰ.运用一对卷积阵列 (分别作用于 x
和 y 方向): Ⅱ.使用下列公式计算梯度幅值和方向:
梯度方向近似到四个可能角度之中的一个(一般为 0, 45, 90,
135) 3.非极大值抑制。 这一步排除非边缘像素, 仅仅
保留了一些细线条(候选边缘)。 4.滞后阈值。最后一步,
Canny 使用了滞后阈值,滞后阈值须要两个阈值(高阈值和低
阈值): Ⅰ.假设某一像素位置的幅值超过 高 阈值, 该像
素被保留为边缘像素。 Ⅱ.假设某一像素位置的幅值小于
低 阈值, 该像素被排除。 Ⅲ.假设某一像素位置的幅值
在两个阈值之间,该像素仅仅在连接到一个高于 高 阈值的
像素时被保留。 tips:对于 Canny 函数的使用,推荐的
高低阈值比在 2:1 到 3:1 之间。 很多其它的细节,能够
參考 canny 算子的 wikipedia:
http://en.wikipedia.org/wiki/Canny_edge_detector canny 边
缘检測的原理讲述,课參看这篇博文:
http://blog.csdn.net/likezhaobin/article/details/6892176
canny 算子的中文 wikipedia:
http://zh.wikipedia.org/wiki/Canny%E7%AE%97%E5%AD%9
0 2.2 OpenCV 中 Canny 函数具体解释 Canny 函数利
用 Canny 算法来进行图像的边缘检測。 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。 须要注意的是,
这个函数阈值 1 和阈值 2 两者的小者用于边缘连接,而大者
用来控制强边缘的初始段,推荐的高低阈值比在 2:1 到 3:1
之间。 调用演示样例: //加载原始图 Mat src =
imread('1.jpg'); //project 文件夹下应该有一张名为 1.jpg 的素
材图 Canny(src, src, 3, 9,3 ); imshow('【效果图】Canny 边缘
检測', src); 如上三句,就有结果出来,非常好用。 2.3
剩余22页未读,继续阅读
资源评论
G11176593
- 粉丝: 6643
- 资源: 3万+
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- JavaScript《基于自动分析数据并给出营业建议的餐厅管理系统(接入AI) 》+源代码+项目说明及资料
- 355670834783295707ad04e-427f-4cde-9589-e578224a8459.zip
- 动态sql解析引擎,类似mybatis动态sql的功能
- EDA365-Skill-V2.5安装包,支持Allegro17.x版本
- C# 常用单词汇总,常用单词汇总
- 【ERP标准流程-标准流程-库内业务管理】(DOC 14页).doc
- Python《数据库期末作业-餐厅点单系统 》+源代码+设计资料
- 学生成绩管理系统(C++课程设计
- 双指针法判断链表有环-go语言实现
- MyBatis动态SQL是一种强大的特性,它允许我们在SQL语句中根据条件动态地添加或删除某些部分,从而实现更加灵活和高效的数据
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功