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

相关文章

HarmonyOS学习(七)——UI(五)常用布局总结

自适应布局 1.1、线性布局(LinearLayout) 通过线性容器Row和Column实现线性布局。Column容器内的子组件按照垂直方向排列,Row组件中的子组件按照水平方向排列。 属性说明space通过space参数设置主轴上子组件的间距,达到各子组件在排列上的等间距效果alignItems设置子组件在交叉轴上的对齐方式,且在各类尺寸屏幕上表现一致,其中交叉轴为垂直时,取值为Vert

Ilya-AI分享的他在OpenAI学习到的15个提示工程技巧

Ilya(不是本人,claude AI)在社交媒体上分享了他在OpenAI学习到的15个Prompt撰写技巧。 以下是详细的内容: 提示精确化:在编写提示时,力求表达清晰准确。清楚地阐述任务需求和概念定义至关重要。例:不用"分析文本",而用"判断这段话的情感倾向:积极、消极还是中性"。 快速迭代:善于快速连续调整提示。熟练的提示工程师能够灵活地进行多轮优化。例:从"总结文章"到"用

【前端学习】AntV G6-08 深入图形与图形分组、自定义节点、节点动画(下)

【课程链接】 AntV G6:深入图形与图形分组、自定义节点、节点动画(下)_哔哩哔哩_bilibili 本章十吾老师讲解了一个复杂的自定义节点中,应该怎样去计算和绘制图形,如何给一个图形制作不间断的动画,以及在鼠标事件之后产生动画。(有点难,需要好好理解) <!DOCTYPE html><html><head><meta charset="UTF-8"><title>06

学习hash总结

2014/1/29/   最近刚开始学hash,名字很陌生,但是hash的思想却很熟悉,以前早就做过此类的题,但是不知道这就是hash思想而已,说白了hash就是一个映射,往往灵活利用数组的下标来实现算法,hash的作用:1、判重;2、统计次数;

2. c#从不同cs的文件调用函数

1.文件目录如下: 2. Program.cs文件的主函数如下 using System;using System.Collections.Generic;using System.Linq;using System.Threading.Tasks;using System.Windows.Forms;namespace datasAnalysis{internal static

综合安防管理平台LntonAIServer视频监控汇聚抖动检测算法优势

LntonAIServer视频质量诊断功能中的抖动检测是一个专门针对视频稳定性进行分析的功能。抖动通常是指视频帧之间的不必要运动,这种运动可能是由于摄像机的移动、传输中的错误或编解码问题导致的。抖动检测对于确保视频内容的平滑性和观看体验至关重要。 优势 1. 提高图像质量 - 清晰度提升:减少抖动,提高图像的清晰度和细节表现力,使得监控画面更加真实可信。 - 细节增强:在低光条件下,抖

C#实战|大乐透选号器[6]:实现实时显示已选择的红蓝球数量

哈喽,你好啊,我是雷工。 关于大乐透选号器在前面已经记录了5篇笔记,这是第6篇; 接下来实现实时显示当前选中红球数量,蓝球数量; 以下为练习笔记。 01 效果演示 当选择和取消选择红球或蓝球时,在对应的位置显示实时已选择的红球、蓝球的数量; 02 标签名称 分别设置Label标签名称为:lblRedCount、lblBlueCount

零基础学习Redis(10) -- zset类型命令使用

zset是有序集合,内部除了存储元素外,还会存储一个score,存储在zset中的元素会按照score的大小升序排列,不同元素的score可以重复,score相同的元素会按照元素的字典序排列。 1. zset常用命令 1.1 zadd  zadd key [NX | XX] [GT | LT]   [CH] [INCR] score member [score member ...]

【机器学习】高斯过程的基本概念和应用领域以及在python中的实例

引言 高斯过程(Gaussian Process,简称GP)是一种概率模型,用于描述一组随机变量的联合概率分布,其中任何一个有限维度的子集都具有高斯分布 文章目录 引言一、高斯过程1.1 基本定义1.1.1 随机过程1.1.2 高斯分布 1.2 高斯过程的特性1.2.1 联合高斯性1.2.2 均值函数1.2.3 协方差函数(或核函数) 1.3 核函数1.4 高斯过程回归(Gauss

烟火目标检测数据集 7800张 烟火检测 带标注 voc yolo

一个包含7800张带标注图像的数据集,专门用于烟火目标检测,是一个非常有价值的资源,尤其对于那些致力于公共安全、事件管理和烟花表演监控等领域的人士而言。下面是对此数据集的一个详细介绍: 数据集名称:烟火目标检测数据集 数据集规模: 图片数量:7800张类别:主要包含烟火类目标,可能还包括其他相关类别,如烟火发射装置、背景等。格式:图像文件通常为JPEG或PNG格式;标注文件可能为X