EmguCV学习笔记 VB.Net 6.1 边缘检测

news2024/9/23 16:09:55

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

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 Shared Sub Sobel(src As Emgu.CV.IInputArray, dst As Emgu.CV.IOutputArray, ddepth As Emgu.CV.CvEnum.DepthType, xorder As Integer, yorder As Integer, Optional kSize As Integer = 3, Optional scale As Double = 1, Optional delta As Double = 0, Optional borderType As Emgu.CV.CvEnum.BorderType = 4)

主要参数说明:

  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 Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click

        Dim m1 As New Mat("C:\learnEmgucv\lena.jpg", CvEnum.ImreadModes.AnyColor)

        '彩色图像进行边缘检测

        Dim result1 As New Mat

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

        ImageBox1.Image = result1

        Dim result2 As New Mat

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

        ImageBox2.Image = result2

        '灰度图像进行边缘检测

        Dim mgray As New Mat

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

        Dim result3 As New Mat

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

        ImageBox3.Image = result3

End Sub

运行后如下图所示:

图6-1 Sobel边缘检测

6.1.2 Laplacian

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

Public Shared Sub Laplacian(src As Emgu.CV.IInputArray, dst As Emgu.CV.IOutputArray, ddepth As Emgu.CV.CvEnum.DepthType, Optional ksize As Integer = 1, Optional scale As Double = 1, Optional delta As Double = 0, Optional borderType As Emgu.CV.CvEnum.BorderType = 4)

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

【代码位置:frmChapter6】Button2_Click

    'Laplacian

    Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click

        Dim m1 As New Mat("C:\learnEmgucv\lena.jpg", CvEnum.ImreadModes.AnyColor)

        '彩色图像进行边缘检测

        Dim result1 As New Mat

        CvInvoke.Laplacian(m1, result1, DepthType.Cv16S, 1, 1)

        ImageBox1.Image = result1

        Dim result2 As New Mat

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

        ImageBox2.Image = result2

        '灰度图像进行边缘检测

        Dim mgray As New Mat

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

        Dim result3 As New Mat

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

        ImageBox3.Image = result3

End Sub

运行后如下图所示:

图6-2 Laplacian边缘检测

6.1.3 Canny

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

Public Shared Sub Canny(image As Emgu.CV.IInputArray, edges As Emgu.CV.IOutputArray, threshold1 As Double, threshold2 As Double, Optional apertureSize As Integer = 3, Optional l2Gradient As Boolean = 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 Sub Button3_Click(sender As Object, e As EventArgs) Handles Button3.Click

        Dim m1 As New Mat("C:\learnEmgucv\lena.jpg", CvEnum.ImreadModes.AnyColor)

        ImageBox1.Image = m1

        Dim result1 As New Mat

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

        ImageBox2.Image = result1

        '灰度图像进行边缘检测

        Dim m2 As New Mat()

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

        Dim result3 As New Mat

        CvInvoke.GaussianBlur(m2, result3, New Drawing.Size(3, 3), 5)

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

        ImageBox3.Image = result3

End Sub

运行后如下图所示:

 

图6-3 Canny边缘检测

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2068027.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Docker中镜像文件的打包传输、容器导出镜像及虚拟机端口映射的实现

内网私有仓库 1、Docker 私有仓库 是集中存放镜像的地⽅,⽽注册服务器 (Registry)是存放仓库的具体服务器。仓库可以被认为是⼀个具体 的项⽬或⽬录。 Docker 公共仓库:https://hub.docker.com 2、Docker 私有仓库的作⽤&#…

2、spring生态圈

咱们打开spring.io网站 可以看到spring的功能是很强大的,再看看它的生态圈

即用型封闭容器市场规模:未来几年年复合增长率CAGR为8.3%

一、市场趋势演变 即用型封闭容器行业近年来呈现出快速增长的趋势,这主要得益于其在制药、生物科技、食品加工等多个领域的广泛应用。随着全球对产品质量和安全性的要求不断提高,即用型封闭容器因其便捷性、高效性和可靠性而备受青睐。预计未来几年&…

PMBOK® 第六版 控制范围

目录 读后感—PMBOK第六版 目录 结果固然重要,过程同样不可或缺。过程不仅是通往预期成果的途径,也是个人和团队能力提升与经验积累的关键阶段。过程中的每一步都是学习和成长的机会,每一次尝试都能激发创新,而公正透明的流程更增…

《黑神话:悟空》的开发语言与开发团队揭秘

在国产游戏领域,《黑神话:悟空》无疑是一颗璀璨的新星,它以独特的视角重新诠释了中国古典名著《西游记》中的孙悟空形象,并以其惊人的视觉效果、深邃的游戏剧情以及精湛的技术实现,赢得了国内外玩家的广泛关注与期待。…

粘包现象 | wireshark抓包的使用

在TCP协议的通信过程中,由于其面向流的特性,数据在传输过程中可能会发生粘包现象,即多个发送的数据包被接收方一次性接收,导致应用层无法正确解析数据。 1.粘包现象概述 TCP协议为了保证传输效率,可能会将多次send调…

java 实体常用校验注解方法

1、常用注解: 注解说明Null只能为nullNotNull(message “id不能为空”)必须不为null,可以为空字符串Min(value)必须为一个不小于指定值的数字Max(value)必须为一个不大于指定值的数字NotBlank(message “姓名不能为空”)验证注解的元素值不为空&#…

vscode中Vue别名路径提示的实现

配置文件中配置别名: 在对应的jsconfig 或者 tsconfig文件中 配置: 文件中使用时候就会出现相应提示:

计算机毕业设计选题推荐-高校学术交流平台-Java/Python项目实战

✨作者主页:IT毕设梦工厂✨ 个人简介:曾从事计算机专业培训教学,擅长Java、Python、微信小程序、Golang、安卓Android等项目实战。接项目定制开发、代码讲解、答辩教学、文档编写、降重等。 ☑文末获取源码☑ 精彩专栏推荐⬇⬇⬇ Java项目 Py…

从HTTP到HTTPS:SSL加密如何重塑互联网安全格局

从HTTP到HTTPS:SSL加密如何重塑互联网安全格局 随着互联网技术的飞速发展,网络安全问题日益凸显,保护用户数据的安全性和隐私性成为了不可忽视的重要议题。从HTTP(超文本传输协议)到HTTPS(超文本传输安全协…

webrtc ns 降噪之粉红噪声参数推导

webrtc中降噪中,前50帧需要进行简单噪声估计,使用白噪声和粉红噪声模型估算。 首先我们 复习 有色噪声(包含白噪声)的一般模型: S(f) 是频率 f 处的功率谱密度。f是频率。α 是一个频谱指数,通常在1左右。…

如何使用ssm实现海鲜自助餐厅系统+vue

TOC ssm068海鲜自助餐厅系统vue 绪论 1.1 选题背景 网络技术和计算机技术发展至今,已经拥有了深厚的理论基础,并在现实中进行了充分运用,尤其是基于计算机运行的软件更是受到各界的关注。计算机软件可以针对不同行业的营业特点以及管理需…

【C++ Primer Plus习题】3.3

问题: 解答: #include <iostream> using namespace std;const int DE_TO_MI 60; const int MI_TO_SE 60;int main() {int degree 0, minute 0, second 0;float degrees 0;cout << "请输入度:";cin >> degree;cout << "请输入分…

Selenium + Python 自动化测试23(综合实战)

我们的目标是:按照这一套资料学习下来,大家可以独立完成自动化测试的任务。 上一篇我们讨论了PO模式和unittest框架、数据驱动结合起来使用。 本篇文章我们综合一下之前学习的内容,试着编写实际项目易用的测试用例脚本。 今天应该是此项目最后一次分享,大家快看,有完整的…

IntelliJ IDEA的maven配置

前言 在 IntelliJ IDEA 中&#xff0c;Maven 的默认配置文件是 settings.xml&#xff0c;它通常位于以下路径&#xff1a; 配置文件位置 全局配置文件&#xff1a; Windows: %USER_HOME%\.m2\settings.xmlmacOS/Linux: ~/.m2/settings.xml 这个文件是 Maven 的全局配置文件。…

闲鱼IP属地地址:去外地会自动变化吗?解析实时更新机制

在数字化时代&#xff0c;网络交易平台如闲鱼已成为我们日常生活中不可或缺的一部分。在进行二手交易时&#xff0c;了解对方的地理位置信息成为许多买家和卖家的关切点。那么&#xff0c;去外地闲鱼IP会变吗&#xff1f;闲鱼IP属地地址是实时更新吗&#xff1f;本文将深入探讨…

C#开发基础之I/O 异步和多线程异步:本质上的区别与使用场景

前言 在桌面软件开发中&#xff0c;异步编程是一种至关重要的技巧&#xff0c;尤其是在需要提高应用程序响应性和并发处理能力时。常见的异步编程模式主要包括 I/O 异步和多线程异步&#xff0c;这两者虽然都实现了非阻塞操作&#xff0c;但在本质上有着显著的区别。理解它们的…

USB分析仪USB3.2日志分析

1.简介 USB2.0总线采用轮询模式&#xff0c;即总线事务开始时&#xff0c;都要先发送IN或者OUT令牌包&#xff0c;以通知端点或者查询端点是否准备好。而USB3.2采用了异步通知模式&#xff0c;若端点没有准备好&#xff0c;则主机无需轮询&#xff0c;端点准备好后会通知主机&…

进程创建:fork函数

fork函数 在Linux系统中&#xff0c;fork函数是用于创建一个新的进程的函数。调用fork函数会创建一个新的进程。 fork函数的原型如下&#xff1a; #include <unistd.h>pid_t fork(void);fork函数没有参数&#xff0c;返回值是一个pid_t类型的值。在成功创建新的进程后…

Python酷库之旅-第三方库Pandas(094)

目录 一、用法精讲 401、pandas.Series.to_string方法 401-1、语法 401-2、参数 401-3、功能 401-4、返回值 401-5、说明 401-6、用法 401-6-1、数据准备 401-6-2、代码示例 401-6-3、结果输出 402、pandas.Series.to_clipboard方法 402-1、语法 402-2、参数 40…