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

摘要:
Canny边缘检测也是一种边缘检测方法,本文介绍了Canny边缘检测的函数及其使用方法,并利用emgucv方法将轮廓检测解算的结果与原文进行比较。Canny边缘检测算子是JohnF.Canny于1986年开发出来的一个多级边缘检测算法。转自:《Canny边缘检测算法原理及其VC实现详解》、“百度百科”和《我的OpenCV学习笔记:检测轮廓,直线,圆以及直线拟合》)Canny边缘检测算子是JohnF.Canny于1986年开发出来的一个多级边缘检测算法。至此,完成canny算子的边缘检测。在OpenCV中使用Canny函数来检测边沿。

Canny边缘检测也是一种边缘检测方法,本文介绍了Canny边缘检测的函数及其使用方法,并利用emgucv方法将轮廓检测解算的结果与原文进行比较。

图像的边缘检测的原理是检测出图像中所有灰度值变化较大的点,而且这些点连接起来就构成了若干线条,这些线条就可以称为图像的边缘。Canny边缘检测算子是John F. Canny于1986年开发出来的一个多级边缘检测算法。

Canny边缘检测的数学原理和算法实现这里就不再了,有兴趣的读者可以查阅专业书籍。

一、概述(若果不想看,可以略过。转自:《Canny边缘检测算法原理及其VC实现详解》、“百度百科”和《我的OpenCV学习笔记(19):检测轮廓,直线,圆以及直线拟合》)

Canny边缘检测算子是John F. Canny于 1986 年开发出来的一个多级边缘检测算法。更为重要的是 Canny 创立了边缘检测计算理论(Computational theory of edge detection)解释这项技术如何工作。

检测轮廓时我们使用canny边沿检测算法,这个算法其实也是基于梯度的。但是,与传统的梯度算法求边沿不同的是:

1.它可以精确的定位边沿的位置。通过沿幅角方向检测模值的极大值点,即边缘点,遍历8个方向图像像素,把每个像素偏导值与相邻像素的模值比较,取其MAX值为边缘点,置像素灰度值为0。这样做的结果使得边沿非常细。
2.双阈值检测。通常一个较小的阈值会保留很多边沿,他们中的一部分是没有用的;而一个较大的阈值则会保留主要的边沿,但是可能会丢失一些边沿信息。怎么把它们结合起来使用呢?具体的做法如下:(其中图像二是较大阈值产生的,图像一是较小阈值产生的)

•对图像进行扫描,当遇到一个非零灰度的像素p(x,y)时,跟踪以p(x,y)为开始点的轮廓线,直到轮廓线的终点q(x,y)。

•考察图像1中与图像2中q(x,y)点位置对应的点s(x,y)的8邻近区域。如果在s(x,y)点的8邻近区域中有非零像素s(x,y)存在,则将其包括到图像2中,作为r(x,y)点。从r(x,y)开始,重复第一步,直到我们在图像1和图像2中都无法继续为止。

•当完成对包含p(x,y)的轮廓线的连结之后,将这条轮廓线标记为已经访问。回到第一步,寻找下一条轮廓线。重复第一步、第二步、第三步,直到图像2中找不到新轮廓线为止。

•至此,完成canny算子的边缘检测。

在OpenCV中使用Canny函数来检测边沿。第一个参数是待检测的图像,第二个参数是检测结果;后两个参数是那两个门限,通常高低阈值比在 2:1 到3:1之间。

参数调整:Canny 算法包含许多可以调整的参数,它们将影响到算法的计算的时间与实效。

高斯滤波器的大小:第一步所用的平滑滤波器将会直接影响 Canny 算法的结果。较小的滤波器产生的模糊效果也较少,这样就可以检测较小、变化明显的细线。较大的滤波器产生的模糊效果也较多,将较大的一块图像区域涂成一个特定点的颜色值。这样带来的结果就是对于检测较大、平滑的边缘更加有用,例如彩虹的边缘。
阈值:使用两个阈值比使用一个阈值更加灵活,但是它还是有阈值存在的共性问题。设置的阈值过高,可能会漏掉重要信息;阈值过低,将会把枝节信息看得很重要。很难给出一个适用于所有图像的通用阈值。目前还没有一个经过验证的实现方法。

不足:Canny 算法适用于不同的场合。它的参数允许根据不同实现的特定要求进行调整以识别不同的边缘特性。对于PC上的实时图像处理来说可能慢得无法使用,尤其是在使用大的高斯滤波器的情况下。但是,我们讨论计算能力的时候,也要考虑到随着处理器速度不断提升,有望在未来几年使得这不再成为一个问题。

二、程序实现

1、关键函数

public static void cvCanny(
	IntPtr image,
	IntPtr edges,
	double threshold1,
	double threshold2,
	int apertureSize
)
第一个参数image,Input image
表示输入图像,必须为单通道灰度图
第二个参数edges,Image to store the edges found by the function

表示输出的边缘图像,为单通道黑白图
第三个参数threshold1,The first threshold
第四个参数threshold2,The second threshold.
第三个参数和第四个参数表示阈值,这二个阈值中当中的小阈值用来控制边缘连接,大的阈值用来控制强边缘的初始分割,即如果一个像素的梯度大与上限值,则被认为是边缘像素,如果小于下限阈值,则被抛弃。如果该点的梯度在两者之间则当这个点与高于上限值的像素点连接时我们才保留,否则删除。
第五个参数aperture,Aperture parameter for Sobel operator
表示Sobel算子大小,默认为3即表示一个3*3的矩阵。Sobel算子与高斯拉普拉斯算子都是常用的边缘算子,详细的数学原理可以查阅专业书籍。
2、编程实现
//canny算子边缘检测
IntPtr Cannyimg = CvInvoke.cvCreateImage(CvInvoke.cvGetSize(Histimg), Emgu.CV.CvEnum.IPL_DEPTH.IPL_DEPTH_8U, 1);
CvInvoke.cvCanny(Histimg, Cannyimg, trackBar1.Value, trackBar1.Value * 3, 3);
MIplImage cannymi = (MIplImage)Marshal.PtrToStructure(Cannyimg, typeof(MIplImage));
Image<Gray, Byte> cannyimage = new Image<Gray, Byte>(cannymi.width, cannymi.height, cannymi.widthStep, cannymi.imageData);
pictureBox5.Image = cannyimage.ToBitmap();

三、结果分析

调整阈值与原文《【OpenCV入门指南】第三篇Canny边缘检测》使用Opencv的方法进行比较结果。

原文的图片和处理之后的图片,阈值设定为100.

[转载+原创]Emgu CV on C# (六) —— Emgu CV on Canny边缘检测第1张[转载+原创]Emgu CV on C# (六) —— Emgu CV on Canny边缘检测第2张

本文利用emgucv方法,按照阈值为100解算获得的结果。

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

从两张图比对看,利用emgucv方法获取的细节更多一些,需要根据项目需要和自身设定场合进行适应性调整。

免责声明:文章转载自《[转载+原创]Emgu CV on C# (六) —— Emgu CV on Canny边缘检测》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇微软Skype实时口译增加中文sublime 技巧与快捷键篇下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

【推荐系统实战】:C++实现基于用户的协同过滤(UserCollaborativeFilter)

好早的时候就打算写这篇文章,可是还是參加阿里大数据竞赛的第一季三月份的时候实验就完毕了。硬生生是拖到了十一假期。自己也是醉了。。。 找工作不是非常顺利,希望写点东西回想一下知识。然后再攒点人品吧,仅仅能如此了。 一、问题背景 二、基于用户的协同过滤算法介绍 三、数据结构和实验过程设计 四、代码 一、问题背景 首先介绍一下问题的背景。如今我有四个月的用户...

粒子群算法(1)----粒子群算法简单介绍

   一、粒子群算法的历史    粒子群算法源于复杂适应系统(Complex Adaptive System,CAS)。CAS理论于1994年正式提出,CAS中的成员称为主体。比方研究鸟群系统,每一个鸟在这个系统中就称为主体。主体有适应性,它能够与环境及其它的主体进行交流,而且依据交流的过程“学习”或“积累经验”改变自身结构与行为。整个系统的演变或进化包...

高精地图技术专栏 | 基于空间连续性的异常3D点云修复技术

简介: 我们需要通过激光的内部机制和数据处理算法,将这些噪声恢复到它本来的位置。本文会从MTA问题产生的原理、激光应对MTA的内部机制、数据处理算法三方面来介绍高精资料处理是如何解决这个问题的。 1.背景 1.1 高精资料采集 高精采集车是集成了测绘激光、高性能惯导、高分辨率相机等传感器为一体的移动测绘系统。高德高精团队经过多年深耕打造的采集车,具有精度高...

Android 9.0 获取CPU温度方法

HardwarePropertiesManager类提供访问设备硬件状态的机制:CPU,GPU和电池温度,每个内核的CPU使用率,风扇速度等。 API 说明:https://www.apiref.com/android-zh/android/os/HardwarePropertiesManager.html source code:  http://and...

matlab从曲线图提取数据

同学用肉体一顿饭让我帮他做下这个DDL样图是一张非常扭曲的三虚线图他甚至想OCR识别x轴y轴坐标单位 上谷歌查了查,对于曲线图提取数据基本上是手动在曲线上取几个点,然后由这个几个点开始遍历领域点,判断领域点是否是黑色,然后再遍历这个黑色点的领域,最终找出一条最长的线便是曲线,一种类似曲线拟合的做法? 知乎专栏提供了一种思路,先把曲线图上无关信息去掉,然...

A*搜索算法

A*搜寻算法俗称A星算法。这是一种在图形平面上,有多个节点的路径,求出最低通过成本的算法。常用于游戏中的NPC的移动计算,或线上游戏的BOT的移动计算上。 这种算法的所获得的路径并不一定是最短路径但一定是我们所关注的某一方面价值最“优”的路径。我们将地图划分为一个个节点,从出发点到目标的路径就可以使用一个节点列表来表示。那么如何获得的这个节点列表才算是“最...