EmguCV学习笔记 C# 6.1 边缘检测

2024-08-22 09:44

本文主要是介绍EmguCV学习笔记 C# 6.1 边缘检测,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

 版权声明:本文为博主原创文章,转载请在显著位置标明本文出处以及作者网名,未经作者允许不得用于商业目的。

EmguCV是一个基于OpenCV的开源免费的跨平台计算机视觉库,它向C#和VB.NET开发者提供了OpenCV库的大部分功能。

教程VB.net版本请访问:EmguCV学习笔记 VB.Net 目录-CSDN博客

教程C#版本请访问:EmguCV学习笔记 C# 目录-CSDN博客

笔者的博客网址:https://blog.csdn.net/uruseibest

教程配套文件及相关说明以及如何获得pdf教程和代码,请移步:EmguCV学习笔记

学习VB.Net知识,请移步: vb.net 教程 目录_vb中如何用datagridview-CSDN博客

 学习C#知识,请移步:C# 教程 目录_c#教程目录-CSDN博客

 

6.1 边缘检测

Emgu.CV常用的边缘检测方法:

1. Canny边缘检测:Canny算法是一种经典的边缘检测算法,可以通过CvInvoke.Canny函数进行调用。该函数接受源图像、低阈值和高阈值作为参数,并返回一个二值图像,其中边缘被标记为白色。

2. Sobel边缘检测:Sobel算子是一种基于梯度的边缘检测算子,可以通过CvInvoke.Sobel函数进行调用。该函数接受源图像、输出图像的深度、x和y方向的导数阶数、卷积核大小和比例因子作为参数,并返回一个浮点型的输出图像,其中边缘的幅值较高。

3. Scharr边缘检测:Scharr算子是一种改进的Sobel算子,可以通过CvInvoke.Scharr函数进行调用。该函数的参数和返回值与Sobel函数相似,但Scharr算子的性能更好。

4. Laplacian边缘检测:Laplacian算子是一种二阶微分算子,可以通过CvInvoke.Laplacian函数进行调用。该函数接受源图像、输出图像的深度和卷积核大小作为参数,并返回一个浮点型的输出图像,其中边缘的幅值较高。

5. Roberts边缘检测:Roberts算子是一种基于差分的边缘检测算子,可以通过CvInvoke.Roberts函数进行调用。该函数接受源图像和输出图像作为参数,并返回一个浮点型的输出图像,其中边缘的幅值较高。

6. Prewitt边缘检测:Prewitt算子是一种基于差分的边缘检测算子,可以通过CvInvoke.Prewitt函数进行调用。该函数接受源图像和输出图像作为参数,并返回一个浮点型的输出图像,其中边缘的幅值较高。

在使用以上边缘检测方法时,需要根据具体的需求选择合适的算法和参数,以达到较好的边缘检测效果。

6.1.1 Soble

CvInvoke.Sobel方法用于执行Sobel边缘检测算法,以检测图像中的边缘。该方法声明如下:

public static void Sobel(

    IInputArray src,

        IOutputArray dst,

        DepthType ddepth,

        int xorder,

        int yorder,

        int kSize = 3,

        double scale = 1,

        double delta = 0,

    BorderType borderType = BorderType.Reflect101

)

主要参数说明:

  1. ddepth:输出图像的深度类型。
  2. xorder:x方向的导数阶数,通常为0或1。
  3. yorder:y方向的导数阶数,通常为0或1。
  4. kSize:Sobel算子的大小,通常为3、5、7等。
  5. scale:导数计算结果的缩放因子。
  6. delta:导数计算结果的偏移量。
  7. borderType:边界模式,用于处理图像边界情况。

通过调整xorder和yorder的值,可以选择计算水平或垂直方向的边缘。kSize指定了Sobel算子的大小,较大的值可以检测到更粗的边缘,但可能会丢失一些细节。scale和delta参数用于调整结果图像的亮度和对比度。

【代码位置:frmChapter6】Button1_Click

        //Sobel

        private void Button1_Click(object sender, EventArgs e)

        {

            Mat m1 = new Mat("C:\\learnEmgucv\\lena.jpg", ImreadModes.AnyColor);

            //彩色图像进行边缘检测

            Mat result1 = new Mat();

            CvInvoke.Sobel(m1, result1, DepthType.Cv16S, 1, 0, 3);

            ImageBox1.Image = result1;

            Mat result2 = new Mat();

            CvInvoke.Sobel(m1, result2, DepthType.Cv16S, 0, 1, 3);

            ImageBox2.Image = result2;

            //灰度图像进行边缘检测

            Mat mgray = new Mat();

            CvInvoke.CvtColor(m1, mgray, ColorConversion.Bgr2Gray);

            Mat result3 = new Mat();

            CvInvoke.Sobel(mgray, result3, DepthType.Cv8U, 2, 0, 3);

            ImageBox3.Image = result3;

        }

运行后如下图所示:

 

图6-1 Sobel边缘检测

6.1.2 Laplacian

CvInvoke.Laplacian方法用于执行Laplace边缘检测算法,以检测图像中的边缘。该方法声明如下:

public static void Laplacian(

    IInputArray src,

        IOutputArray dst,

        DepthType ddepth,

        int ksize = 1,

        double scale = 1,

        double delta = 0,

    BorderType borderType = BorderType.Reflect101

)

参数说明参看6.1.1节【Soble】。

【代码位置:frmChapter6】Button2_Click

        //Laplacian

        private void Button2_Click(object sender, EventArgs e)

        {

            Mat m1 = new Mat("C:\\learnEmgucv\\lena.jpg", ImreadModes.AnyColor);

            //彩色图像进行边缘检测

            Mat result1 = new Mat();

            CvInvoke.Laplacian(m1, result1, DepthType.Cv16S, 1, 1);  //(m1, result1, DepthType.Cv16S, 1, 0, 3);

            ImageBox1.Image = result1;

            Mat result2 = new Mat();

            CvInvoke.Laplacian(m1, result2, DepthType.Cv16S, 3);

            ImageBox2.Image = result2;

            //灰度图像进行边缘检测

            Mat mgray = new Mat();

            CvInvoke.CvtColor(m1, mgray, ColorConversion.Bgr2Gray);

            Mat result3 = new Mat();

            CvInvoke.Laplacian(mgray, result3, DepthType.Cv8U, 3);

            ImageBox3.Image = result3;

        }

运行后如下图所示:

 

图6-2 Laplacian边缘检测

6.1.3 Canny

CvInvoke.Canny方法用于执行Canny边缘检测算法,以检测图像中的边缘。该方法常用的一个声明如下:

public static void Canny(

    IInputArray image,

        IOutputArray edges,

        double threshold1,

        double threshold2,

        int apertureSize = 3,

    bool l2Gradient = false

)

主要参数说明:

  1. edges:要输出的边缘图像,为单通道黑白图。
  2. threshold1:第一个阈值。
  3. threshold2:第二个阈值。
  4. apertureSize:Sobel算子的大小。常用的有3、5、7等。
  5. L2gradient:是否使用更精确的L2范数计算梯度大小。

Canny算法首先使用Sobel算子计算图像中的梯度,然后通过比较梯度与阈值的大小来确定边缘像素。threshold1和threshold2用于控制边缘像素的阈值,低于threshold1的像素将被认为是非边缘像素,高于threshold2的像素将被认为是边缘像素,介于两者之间的像素将根据其与阈值的关系进行进一步判断。apertureSize指定了Sobel算子的大小,较大的值可以检测到更粗的边缘,但可能会丢失一些细节。L2gradient参数用于选择是否使用更精确的L2范数计算梯度大小。

【代码位置:frmChapter6】Button3_Click

        //Canny

        private void Button3_Click(object sender, EventArgs e)

        {

            Mat m1 = new Mat("C:\\learnEmgucv\\lena.jpg", ImreadModes.AnyColor);

            ImageBox1.Image = m1;

            Mat result1 = new Mat();

            CvInvoke.Canny(m1, result1, 100, 200, 3);

            ImageBox2.Image = result1;

            //灰度图像进行边缘检测

            Mat m2 = new Mat();

            CvInvoke.CvtColor(m1, m2, ColorConversion.Bgr2Gray);

            Mat result3 = new Mat();

            CvInvoke.GaussianBlur(m2, result3, new Size(3, 3), 5);

            CvInvoke.Canny(result3, result3, 100, 200, 3);

            ImageBox3.Image = result3;

        }

运行后如下图所示:

 

图6-3 Canny边缘检测

这篇关于EmguCV学习笔记 C# 6.1 边缘检测的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1095917

相关文章

C#中lock关键字的使用小结

《C#中lock关键字的使用小结》在C#中,lock关键字用于确保当一个线程位于给定实例的代码块中时,其他线程无法访问同一实例的该代码块,下面就来介绍一下lock关键字的使用... 目录使用方式工作原理注意事项示例代码为什么不能lock值类型在C#中,lock关键字用于确保当一个线程位于给定实例的代码块中时

C# $字符串插值的使用

《C#$字符串插值的使用》本文介绍了C#中的字符串插值功能,详细介绍了使用$符号的实现方式,文中通过示例代码介绍的非常详细,需要的朋友们下面随着小编来一起学习学习吧... 目录$ 字符使用方式创建内插字符串包含不同的数据类型控制内插表达式的格式控制内插表达式的对齐方式内插表达式中使用转义序列内插表达式中使用

C#中的Converter的具体应用

《C#中的Converter的具体应用》C#中的Converter提供了一种灵活的类型转换机制,本文详细介绍了Converter的基本概念、使用场景,具有一定的参考价值,感兴趣的可以了解一下... 目录Converter的基本概念1. Converter委托2. 使用场景布尔型转换示例示例1:简单的字符串到

C#监听txt文档获取新数据方式

《C#监听txt文档获取新数据方式》文章介绍通过监听txt文件获取最新数据,并实现开机自启动、禁用窗口关闭按钮、阻止Ctrl+C中断及防止程序退出等功能,代码整合于主函数中,供参考学习... 目录前言一、监听txt文档增加数据二、其他功能1. 设置开机自启动2. 禁止控制台窗口关闭按钮3. 阻止Ctrl +

C#解析JSON数据全攻略指南

《C#解析JSON数据全攻略指南》这篇文章主要为大家详细介绍了使用C#解析JSON数据全攻略指南,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录一、为什么jsON是C#开发必修课?二、四步搞定网络JSON数据1. 获取数据 - HttpClient最佳实践2. 动态解析 - 快速

C#连接SQL server数据库命令的基本步骤

《C#连接SQLserver数据库命令的基本步骤》文章讲解了连接SQLServer数据库的步骤,包括引入命名空间、构建连接字符串、使用SqlConnection和SqlCommand执行SQL操作,... 目录建议配合使用:如何下载和安装SQL server数据库-CSDN博客1. 引入必要的命名空间2.

Linux系统性能检测命令详解

《Linux系统性能检测命令详解》本文介绍了Linux系统常用的监控命令(如top、vmstat、iostat、htop等)及其参数功能,涵盖进程状态、内存使用、磁盘I/O、系统负载等多维度资源监控,... 目录toppsuptimevmstatIOStatiotopslabtophtopdstatnmon

C#读写文本文件的多种方式详解

《C#读写文本文件的多种方式详解》这篇文章主要为大家详细介绍了C#中各种常用的文件读写方式,包括文本文件,二进制文件、CSV文件、JSON文件等,有需要的小伙伴可以参考一下... 目录一、文本文件读写1. 使用 File 类的静态方法2. 使用 StreamReader 和 StreamWriter二、二进

C#中Guid类使用小结

《C#中Guid类使用小结》本文主要介绍了C#中Guid类用于生成和操作128位的唯一标识符,用于数据库主键及分布式系统,支持通过NewGuid、Parse等方法生成,感兴趣的可以了解一下... 目录前言一、什么是 Guid二、生成 Guid1. 使用 Guid.NewGuid() 方法2. 从字符串创建

C# 比较两个list 之间元素差异的常用方法

《C#比较两个list之间元素差异的常用方法》:本文主要介绍C#比较两个list之间元素差异,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录1. 使用Except方法2. 使用Except的逆操作3. 使用LINQ的Join,GroupJoin