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

news/2024/9/18 12:39:01/ 标签: 图像, 计算机视觉, vb.net, opencv, emgucv, .net

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

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知识,请移步: .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.ppmy.cn/news/1515456.html

相关文章

成功解决:“Could not resolve host: mirrorlist.centos.org; Unknown error“

检查网络连接: 确保你的系统网络连接正常,并且能够访问互联网。你可以使用 ping 命令来测试网络连接: ping google.com ping mirrorlist.centos.org检查DNS配置: 确保DNS配置正确,可以尝试将 /etc/resolv.conf 文件中添…

一条sql 在MySQL中是如何执行的

在 MySQL 中,SQL 查询的执行涉及多个内存区域和处理步骤,以确保查询能够高效地执行和返回结果。以下是 SQL 查询在 MySQL 中执行时通常会经过的内存路径: 1. 客户端内存 - SQL 文本发送 :SQL 查询首先从客户端发送到 MySQL 服务…

爱Q乐园网的QQ技术门户论坛DZ模板+diy源码

模板介绍 爱Q乐园-QQ技术综合娱乐门户网,之前用过的一套模板分享给大家,提供给大家学习。 原为迪恩游戏测评模板,原价300多,小编做了一些修改,更加适合QQ技术资源门户论坛,有兴趣的可以看看 使用方法&am…

解决方案:在jupyter notebook环境下安装不了numpy

文章目录 一、现象二、解决方案 一、现象 平台:autodl 镜像:PyTorch 2.0.0 Python 3.8(ubuntu20.04) Cuda 11.8 GPU:RTX 4090(24GB) * 1 CPU:12 vCPU Intel Xeon Platinum 8352V CPU 2.10GHz 内存:90GB 安装numpy环…

使用密钥文件 SSH 登录服务器:Windows、macOS使用终端或连接工具

文章目录 使用密钥文件 SSH 登录服务器1. Windows端方法 1:使用 ssh 命令指定密钥文件方法 2:使用 SSH 配置文件 2. macOS端方法 1:使用 ssh 命令指定密钥文件方法 2:使用 SSH 配置文件方法 3:使用 ssh-add 命令&#…

SpringBoot文档之测试框架的阅读笔记

Testing SpringBoot提供了组件spring-boot-test供开发者集成。 Test Scope Dependencies 组件spring-boot-test导入了对如下测试工具的依赖。 JUnit 5: The de-facto standard for unit testing Java applications.Spring Test & Spring Boot Test: Utilities and integra…

Theory of Cryptography (TCC 2021)

分类文章编号基础理论1-5,47-53量子6-9,30-34多方安全计算10-16,35-40ABE,FE,混淆和非传统模型17-23零知识证明24-29隐私查找,加密内存和承诺机制41-46零知识证明,OT和密钥管理54-60路由,签名,承诺和时间锁61-65Foundations I 1. Simple Constructions from (Almost)…

兵临城下:分析针对金融服务的攻击

金融服务是受网络犯罪影响最严重的行业之一——从宙斯和其他银行木马的鼎盛时期到分布式拒绝服务(DDoS) 攻击、现代网络钓鱼攻击和勒索软件。金融服务是一个至关重要的行业,不仅在人们的生活中发挥着重要作用,而且在全球经济中也发挥着重要作用。 金融服务的任何中断或停机都…

nginx做代理 转发前端请求到后端

Nginx 作为反向代理服务器可以很好地处理代理转发的请求,它能够将客户端的请求转发到后端服务器,并将后端服务器的响应返回给客户端(避免直接向后端发送请求,隐藏后端服务器地址)。下面介绍如何配置 Nginx 进行代理转发…

vue全局参数

/* eslint-disable no-new */ new Vue({el: #app,router,components: { App },template: <App/>,data:function(){return{wbWinList: [] // 定义的变量&#xff0c;全局参数}}, }) //使用全局参数 // this.$root.backgroundColor 666;其它页面如果想监听改变 //监听全…

minio 后端大文件分片上传,合并,删除分片

背景 网上大多数minio大文件上传都是采用后台返回前端预上传链接&#xff0c;然后由前端去put请求直接和minio通信上传分片文件&#xff0c;然后调用后台合并分片逻辑来达到快申诉上传的目的&#xff0c;详情可以参考我的上两篇文章 最近有个项目域名是https的&#xff0c;但…

Linux | 文件描述符fd详解及重定向技术的应用

多谢梅花&#xff0c;伴我微吟。 - 《高阳台除夜》(韩疁) 2024.8.23 目录 1、文件描述符fd 文件操作符概念(简单带过) 重点&#xff1a;如何理解文件操作符使得系统实现了设备无关性&#xff1f;&#xff08;使得操作系统无需关心具体的硬件细节&#xff09; 示例代码:标准输入…

【内网渗透】ICMP隧道技术,ICMP封装穿透防火墙上线MSF/CS

~ 会当凌绝顶&#xff0c;一览众山小 ~ 前言 博客主页&#xff1a;h0ack1r丶羽~ 从0到1~ 渗透测试中&#xff0c;如果攻击者使用各类上层隧道(例如&#xff1a;HTTP隧道、DNS隧道、常规正/反向端口转发等)进行的操作都失败了&#xff0c;常常会通过ping命令访问远程计算机&am…

【vue】编辑器段落对应材料同步滚动交互

场景需求 编辑器段落对应显示材料编辑器滚动时&#xff0c;材料同步滚动编辑器段落无数据时&#xff0c;材料不显示 实现方法 编辑器与材料组件左右布局获取编辑器高度&#xff0c;材料高度与编辑器高度一致禁用材料组件的滚动事件获取编辑器段落距离顶部的位置&#xff0c;…

【Docker】Docker学习01 | 什么是docker?

本文首发于 ❄️慕雪的寒舍 因为本人没有学习过docker&#xff0c;虽然部署过很多镜像&#xff0c;但是对于docker底层的实现一概不知。趁学习一个新项目的契机&#xff0c;将docker的相关概念了解清楚。 安装docker的教程请查看 Linux主机安装docker。 如果你想和我一起学习do…

【计算机网络】网络版本计算器

此前我们关于TCP协议一直写的都是直接recv或者read&#xff0c;有了字节流的概念后&#xff0c;我们知道这样直接读可能会出错&#xff0c;所以我们如何进行分割完整报文&#xff1f;这就需要报头来解决了&#xff01; 但当前我们先不谈这个话题&#xff0c;先从头开始。 将会…

[Algorithm][综合训练][mari和shiny][重排字符串]详细讲解

目录 1.mari和shiny1.题目链接2.算法原理详解 && 代码实现 2.重排字符串1.题目链接2.算法原理详解 && 代码实现 1.mari和shiny 1.题目链接 mari和shiny 2.算法原理详解 && 代码实现 自己的版本&#xff1a;三层循环暴力枚举 --> 超时 --> 40% …

Android如何高效的加载大型位图

图片有各种形状和大小。在很多情况下,它们的大小超过了典型应用界面的要求。例如,系统“图库”应用会显示使用 Android 设备的相机拍摄的照片,这些照片的分辨率通常远高于设备的屏幕密度。 鉴于使用的内存有限,理想情况下您只希望在内存中加载较低分辨率的版本。分辨率较低…

【记录】基于Windows系统安装rust环境的过程

到官网下载安装包【入门 - Rust 程序设计语言 (rust-lang.org)】 ![[Pasted image 20240703142911.png]] 选择1&#xff0c;快速安装 选择编译配置&#xff0c;1为标准 安装完成 验证是否安装完毕 rustc --versioncargo --version验证成功&#xff01;

从0到1使用webpack搭建react脚手架

背景 好多前端童鞋工作多年依然不会使用webpack搭建react脚手架&#xff0c;本文就介绍下如何从零开始搭建一个属于你自己的前端脚手架&#xff0c;提高自己的工程化实力&#xff0c;同时也提高团队的开发效率。 一、基础配置 目标&#xff1a;可以启动最简单的react项目 初…