当前位置: 首页 > news >正文

EmguCV学习笔记 VB.Net 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 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边缘检测

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 深入探讨 C++ 中的 `constexpr` 函数及其限制
  • UE5.4 - 编辑器页面和概念术语
  • 达梦数据库表结构导出到 Excel 教程
  • 【hot100篇-python刷题记录】【字母异位词分组】
  • 基于YOLOv8的船舶目标检测与分割(ONNX模型)
  • ASP.NET Core 6.0 传统鉴权配置
  • Docker 推送镜像到私有仓库【真实案例】
  • 【Oracle19c】手工数据统计信息并导入dmp数据
  • LeetCode128.最长连续序列
  • select模型实现TCP聊天室
  • 聚星文社推文软件
  • Qt/QML学习-ScrollView
  • 【TS】函数重载的作用
  • 超简单亿图图示安装教程/快速入门指南及快捷键大全
  • C++拾趣——使用VSCode跨平台调试CMake编译的C/C++项目
  • #Java异常处理
  • 0基础学习移动端适配
  • axios请求、和返回数据拦截,统一请求报错提示_012
  • canvas 绘制双线技巧
  • CAP理论的例子讲解
  • ES6系列(二)变量的解构赋值
  • EventListener原理
  • Java编程基础24——递归练习
  • Laravel核心解读--Facades
  • leetcode-27. Remove Element
  • Linux学习笔记6-使用fdisk进行磁盘管理
  • macOS 中 shell 创建文件夹及文件并 VS Code 打开
  • mongodb--安装和初步使用教程
  • Vue 2.3、2.4 知识点小结
  • 对话:中国为什么有前途/ 写给中国的经济学
  • 多线程 start 和 run 方法到底有什么区别?
  • 两列自适应布局方案整理
  • const的用法,特别是用在函数前面与后面的区别
  • 正则表达式-基础知识Review
  • ​ubuntu下安装kvm虚拟机
  • ​二进制运算符:(与运算)、|(或运算)、~(取反运算)、^(异或运算)、位移运算符​
  • ###C语言程序设计-----C语言学习(6)#
  • #传输# #传输数据判断#
  • #我与Java虚拟机的故事#连载18:JAVA成长之路
  • $Django python中使用redis, django中使用(封装了),redis开启事务(管道)
  • (NO.00004)iOS实现打砖块游戏(九):游戏中小球与反弹棒的碰撞
  • (笔试题)分解质因式
  • (附源码)spring boot车辆管理系统 毕业设计 031034
  • (附源码)springboot青少年公共卫生教育平台 毕业设计 643214
  • (附源码)计算机毕业设计ssm-Java网名推荐系统
  • (没学懂,待填坑)【动态规划】数位动态规划
  • (每日一问)计算机网络:浏览器输入一个地址到跳出网页这个过程中发生了哪些事情?(废话少说版)
  • (十二)devops持续集成开发——jenkins的全局工具配置之sonar qube环境安装及配置
  • *p++,*(p++),*++p,(*p)++区别?
  • .net core 6 集成和使用 mongodb
  • .NET CORE使用Redis分布式锁续命(续期)问题
  • .NET 的静态构造函数是否线程安全?答案是肯定的!
  • .NET/C# 将一个命令行参数字符串转换为命令行参数数组 args
  • .NET:自动将请求参数绑定到ASPX、ASHX和MVC(菜鸟必看)
  • .NET开源快速、强大、免费的电子表格组件