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

news2024/12/24 21:36:43

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

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边缘检测

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

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

相关文章

【云原生】MySQL的源码编译

1、实验环境 (1)虚拟机版本:RHEL7.9 (2)主机 主机名称IP地址mysql-node1172.25.254.10mysql-node2172.25.254.20 2、实验步骤 注意:我们的两台主机都要进行MySQL源码编译,并且操作相同&…

二手物品交易boot代码

TOC springboot548二手物品交易boot代码--论文pf 第1章 绪论 1.1 课题背景 二十一世纪互联网的出现,改变了几千年以来人们的生活,不仅仅是生活物资的丰富,还有精神层次的丰富。在互联网诞生之前,地域位置往往是人们思想上不可…

Leaflet+Leaflet-Geoman绘制天地图

安装所需依赖 yarn add leaflet geoman-io/leaflet-geoman-free文档地址 https://leafletjs.cn/ https://geoman.io/ <template><div id"map"></div><div class"handle"><button click"drawMap">绘制区块</b…

什么是生信分析?深入探讨生物信息学的技术、方法与广泛应用

介绍 生物信息学分析&#xff0c;简称生信分析&#xff0c;是一个结合了生物学、计算机科学、信息学和统计学的多学科领域&#xff0c;旨在处理、分析和解释海量的生物数据。随着现代生物技术的发展&#xff0c;尤其是高通量测序&#xff08;Next-Generation Sequencing, NGS&…

ArcGIS热点分析 (Getis-Ord Gi*)——七普地级市人口普查数据的热点与冷点分析

先了解什么是热点分析 ? 热点分析 (Getis-Ord Gi*) 是一种用于空间数据分析的技术&#xff0c;主要用于识别地理空间数据中值的聚集模式&#xff0c;可以帮助我们理解哪些区域存在高值或低值的聚集&#xff0c;这些聚集通常被称为“热点”或“冷点”&#xff0c;Gi* 统计量为…

LSI-9361阵列卡笔记

背景 要将raid0更改为JBOD直通模式 注意的点是要先将raid模式调整为JBOD之后重启机器&#xff0c;即可 备注&#xff1a;转换过程中硬盘中的数据未丢失。 步骤贴图 refer https://zhiliao.h3c.com/questions/dispcont/123250 https://blog.csdn.net/GreapFruit_J/article/…

Debian12安装jdk8环境

下载JDK8 下载页面&#xff1a;https://repo.huaweicloud.com:8443/artifactory/java-local/jdk/ 笔者下载的是8u202&#xff1a; #wget https://repo.huaweicloud.com:8443/artifactory/java-local/jdk/8u202-b08/jdk-8u202-linux-x64.tar.gz 解压安装 1、使用命令将压缩包复…

Golang | Leetcode Golang题解之第354题俄罗斯套娃信封问题

题目&#xff1a; 题解&#xff1a; func maxEnvelopes(envelopes [][]int) int {n : len(envelopes)if n 0 {return 0}sort.Slice(envelopes, func(i, j int) bool {a, b : envelopes[i], envelopes[j]return a[0] < b[0] || a[0] b[0] && a[1] > b[1]})f : …

旅游网站

TOC springboot281旅游网站 第1章 绪论 1.1 课题背景 互联网发展至今&#xff0c;无论是其理论还是技术都已经成熟&#xff0c;而且它广泛参与在社会中的方方面面。它让信息都可以通过网络传播&#xff0c;搭配信息管理工具可以很好地为人们提供服务。所以各行业&#xff0…

【今夕是何年】雅达利发布Atari 7800+游戏主机:配备无线手柄、HDMI接口

雅达利&#xff08;Atari&#xff09;发布了Atari 7800游戏主机&#xff0c;目前这款主机在其官方商城接受预定&#xff0c;售价129.99美元。Atari 7800游戏主机&#xff0c;作为Atari 7800系列的革新升级版本&#xff0c;搭载了高效的Rockchip 3128处理器&#xff0c;不仅确保…

Q*算法深度猜想:从Q-learning优化到智能决策

Q*算法深度猜想&#xff1a;从Q-learning优化到智能决策 引言 在强化学习&#xff08;Reinforcement Learning&#xff09;中&#xff0c;Q-learning算法作为一种无模型的学习方法&#xff0c;被广泛应用于解决各种决策优化问题。然而&#xff0c;尽管Q-learning在许多场景下…

基于YOLOv8的船舶目标检测与分割(ONNX模型)

项目背景 需求分析&#xff1a;在海洋监控、港口管理、海事安全等领域&#xff0c;自动化的船只检测与分割技术对于提高效率和安全性至关重要。技术选型&#xff1a;YOLOv8是YOLO系列的一个较新版本&#xff0c;以其速度快、准确率高而著称。使用ONNX&#xff08;Open Neural …

深入理解Softmax:从“Hard”到“Soft”的转变

深入理解Softmax&#xff1a;从“Hard”到“Soft”的转变 在机器学习的分类任务中&#xff0c;Softmax 函数是一个极其重要的工具。它不仅将神经网络的输出转化为概率分布&#xff0c;还能有效处理多分类问题。然而&#xff0c;为了更好地理解Softmax&#xff0c;我们可以先将…

漫画小程序源码全开源商业版

介绍&#xff1a; 漫画小程序源码全开源商业版 带漫画资源&#xff0c;带简单安装说明&#xff0c;可以快速发布一个漫画小程序。 代码下载

秋招力扣Hot100刷题总结——链表

1. 反转链表题目连接 题目要求&#xff1a;给你单链表的头节点 head &#xff0c;请你反转链表&#xff0c;并返回反转后的链表。 代码及思路 遍历所有节点&#xff0c;将所有节点的next指向前一个节点由于要改变节点的next指向&#xff0c;而链表是单向的&#xff0c;因此需要…

Spring MVC域对象共享数据

在Spring MVC中&#xff0c;域对象&#xff08;Domain Object&#xff09;通常指的是与业务逻辑相关的模型对象&#xff0c;它们代表了应用程序中的核心数据结构。例如&#xff0c;在一个电商应用中&#xff0c;Product、User、Order等类可以被视为域对象。这些对象通常与数据库…

Pod基础使用

POD基本操作 1.Pod生命周期 在Kubernetes中&#xff0c;Pod的生命周期经历了几个重要的阶段。下面是Pod生命周期的详细介绍&#xff1a; Pending&#xff08;待处理&#xff09;: 调度: Pod被创建后&#xff0c;首先进入“Pending”状态。此时&#xff0c;Kubernetes的调度器…

设计模式24-命令模式

设计模式24-命令模式 写在前面行为变化模式 命令模式的动机定义与结构定义结构 C 代码推导优缺点应用场景总结补充函数对象&#xff08;Functors&#xff09;定义具体例子示例&#xff1a;使用函数对象进行自定义排序代码说明输出结果具体应用 优缺点应用场景 命令模式&#xf…

查看 CUDA 和 cuDNN 版本

在安装 onnxruntime-gpu 选择版本时需要查看本机 CUDA 和 cuDNN 版本。 查看 CUDA 和 cuDNN 版本 import platform import torchprint("python.version:", platform.python_version()) print("torch.version:", torch.__version__) print("CUDA.vers…

汽车管理 API 接口:开启高效车辆运营新时代

API&#xff08;Application Programming Interface&#xff09;是一种接口&#xff0c;用于不同软件之间的通信。在汽车管理领域&#xff0c;API的应用可以帮助提升车辆运营的效率&#xff0c;让车主和车辆管理者更方便地获取车辆相关信息&#xff0c;进行保养和维修等工作。本…