EmguCV学习笔记 C# 4.2 二值化

news2024/11/15 13:22:28

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

教程VB.net版本请访问:
EmguCV学习笔记 VB.Net 目录-CSDN博客

教程C#版本请访问:EmguCV学习笔记 C# 目录-CSDN博客

笔者的博客网址:https://blog.csdn.net/uruseibest

教程配套文件及相关说明以及如何获得pdf教程和代码(博客上的教程内容会和pdf教程一致,教程中也会包含所有代码),请移步:EmguCV学习笔记

 

4.2 二值化

4.2.1 Threshold    

Threshold方法用于对图像进行二值化处理,将图像中的像素值转换为0或255,以便于后续的图像分割、形状检测等处理。该方法只能处理灰度图像,如果要对彩色图像进行二值化处理,需要先将其转换为灰度图像。此外,在使用Threshold方法时,还需要根据实际情况选择不同的二值化操作类型,以达到最佳的处理效果。

Threshold的声明如下:

public static double Threshold(

           IInputArray src,

                    IOutputArray dst,

                    double threshold,

                    double maxValue,

           ThresholdType thresholdType

)

参数说明:

  1. src:原始图像,通常是Mat类型。
  2. dst:输出图像,通常是Mat类型。
  3. thresh:阈值,Double类型。
  4. maxval:最大值,Double类型,在二值化操作中,将大于阈值的像素值设为该值。
  5. type:二值化操作的类型,ThresholdType类型,包括以下常量:
  1. Binary:二值化操作,将大于阈值的像素值设为maxval,小于等于阈值的像素值设为0。
  2. BinaryInv:反向二值化操作,将小于等于阈值的像素值设为maxval,大于阈值的像素值设为0。
  3. Trunc:截断操作,将大于阈值的像素值设为阈值,小于等于阈值的像素值不变。
  4. ToZero:零值操作,将小于等于阈值的像素值设为0,大于阈值的像素值不变。
  5. ToZeroInv:反向零值操作,将大于阈值的像素值设为0,小于等于阈值的像素值不变。
  6. Otsu:使用大津法,通过分析图像的灰度直方图,自动确定最佳的阈值,从而实现二值化,可以适用于大部分图像的二值化处理。如果使用了此类型,那么thresh参数将忽略。
  7. Triangle:使用Triangle算法,通过寻找直方图中的三角形区域,自动确定最佳的阈值,从而实现二值化。如果使用了此类型,那么thresh参数将忽略。

返回值:

返回ThresholdType为Otsu 或Triangle时,确定的最佳阈值(threshold的参数的值);如果ThresholdType不是Otsu 或Triangle,那么就返回设定的阈值。

【代码位置:frmChapter4】Button2_Click

        //Threshold

        private void Button2_Click(object sender, EventArgs e)

        {

            //可以直接使用ImreadModes.Grayscale,这里为了直观对比使用彩色图像

            Mat m = new Mat("C:\\learnEmgucv\\lena.jpg", ImreadModes.Color);

            ImageBox1.Image = m;

            //灰度转换

            Mat mgray = new Mat();

            CvInvoke.CvtColor(m, mgray, ColorConversion.Bgr2Gray);

            Mat mOut1 = new Mat();

            //使用Binary类型进行二值化

            CvInvoke.Threshold(mgray, mOut1, 125, 255, ThresholdType.Binary);

            ImageBox2.Image = mOut1;

            Mat mOut2 = new Mat();

            Double thresh;

            //使用大律法自动确定阈值进行二值化,并返回使用Otsu计算出的阈值

            thresh = CvInvoke.Threshold(mgray, mOut2, 0, 255, ThresholdType.Otsu);

            ImageBox3.Image = mOut2;

        }

运行后如下图所示:

 

图4-3 图像二值化

4.2.2 AdaptiveThreshold

AdaptiveThreshold方法用于对图像进行自适应阈值处理,将图像中的像素值转换为0或255,以便于后续的图像分割、形状检测等处理。该方法只能处理灰度图像,如果要对彩色图像进行自适应阈值处理,需要先将其转换为灰度图像。

AdaptiveThreshold方法的声明如下:

public static void AdaptiveThreshold(

           IInputArray src,

                    IOutputArray dst,

                    double maxValue,

                    AdaptiveThresholdType adaptiveType,

                    ThresholdType thresholdType,

           int blockSize,

           double param1

)

主要参数说明:

  1. maxValue:最大值,Double类型,在二值化操作中,将大于阈值的像素值设为该值。
  2. adaptiveMethod:自适应阈值处理的方法,AdaptiveThresholdTyp类型,包括以下常量:
    1. MeanC:阈值为邻域内的均值减去一个常数(param1)。
    2. GaussianC:阈值为邻域内的高斯加权平均值减去一个常数(param1)。
  3. thresholdType:二值化操作的类型,只能是ThresholdType类型的Binary或者BinaryInv。
  4. blockSize:邻域大小,必须为大于3的奇数。
  5. param1:常数,Double类型,表示从均值或高斯加权均值中减去的常数。

【代码位置:frmChapter4】Button3_Click

        //AdaptiveThreshold

        private void Button3_Click(object sender, EventArgs e)

        {

            Mat m = new Mat("C:\\learnEmgucv\\lena.jpg", ImreadModes.Color);

            ImageBox1.Image = m;

            //彩色转为灰度

            Mat mgray = new Mat();

            CvInvoke.CvtColor(m, mgray, ColorConversion.Bgr2Gray);

            Mat mOut1 = new Mat();

            //使用高斯加权平均值进行二值化

            CvInvoke.AdaptiveThreshold(mgray, mOut1, 255, AdaptiveThresholdType.GaussianC, ThresholdType.Binary, 3, 0);

            ImageBox2.Image = mOut1;

            Mat mOut2 = new Mat();

            //使用均值进行二值化

            CvInvoke.AdaptiveThreshold(mgray, mOut2, 255, AdaptiveThresholdType.MeanC, ThresholdType.Binary, 3, 0);

            ImageBox3.Image = mOut2;

        }

运行后如下图所示:

 

图4-4 使用AdaptiveThreshold进行图像二值化

4.2.3 图像通道分离和合并

图像通道的分离和合并分别使用到了CvInvoke的Split和Merge方法。Merge方法在2.3.11节【图像通道的分离与合并】有介绍,而CvInvoke.Split方法和该节的Mat.Split方法有所区别,详细请看代码说明。

【代码位置:frmChapter4】Button4_Click

        //通道分离和合并

        private void Button4_Click(object sender, EventArgs e)

        {

            Mat m = new Mat("C:\\learnEmgucv\\lena.jpg", ImreadModes.Color);

            ImageBox1.Image = m;

            //将图像通道分离到 VectorOfMat

            VectorOfMat vom = new VectorOfMat();

            CvInvoke.Split(m, vom);

            Mat mOut1 = new Mat();

            //输出分离后的第一个通道

            mOut1 = vom[0];

            ImageBox2.Image = mOut1;

            //注意和CvInvoke.Split的对比

            Mat[] channels = m.Split();

            //对三个通道分别进行二值化

            CvInvoke.Threshold(channels[0], channels[0], 100, 255, Emgu.CV.CvEnum.ThresholdType.Binary);

            CvInvoke.Threshold(channels[1], channels[0], 100, 255, Emgu.CV.CvEnum.ThresholdType.Binary);

            CvInvoke.Threshold(channels[2], channels[0], 100, 255, Emgu.CV.CvEnum.ThresholdType.Binary);

            //将处理后的三个通道推入 VectorOfMat

            VectorOfMat newm = new VectorOfMat();

            newm.Push(channels[0]);

            newm.Push(channels[1]);

            newm.Push(channels[2]);

            Mat mdst = new Mat();

            //合并通道

            CvInvoke.Merge(newm, mdst);

            ImageBox3.Image = mdst;

        }

运行后如下图所示:

 

图4-5 图像通道的分离和合并

4.2.4 按颜色分离

CvInvoke.InRange方法用于在图像中找到指定范围内的像素,并将其设置为白色,其余的像素设置为黑色。在使用CvInvoke.InRange方法时,需要根据实际情况选择合适的下限和上限,以达到最佳的处理效果。同时,CvInvoke.InRange方法只能处理单通道和三通道的图像。如果图像通道数不为1或3,需要先将其转换为单通道或三通道图像。

InRange方法的声明如下:

public static void InRange(

           IInputArray src,

                    IInputArray lower,

                    IInputArray upper,

           IOutputArray dst

)

主要参数说明:

lowerb参数是指定范围的下限。

upperb参数是指定范围的上限。

【代码位置:frmChapter4】Button5_Click

       //颜色分离

        private void Button5_Click(object sender, EventArgs e)

        {

            Mat m = new Mat("C:\\learnEmgucv\\wslt.jpg", ImreadModes.Color);

            ImageBox1.Image = m;

            Mat hsv = new Mat();

            //转为Hsv,更容易分离颜色

            CvInvoke.CvtColor(m, hsv, ColorConversion.Bgr2Hsv);

            //设置颜色范围下限和上限,需要根据实际慢慢修改

            ScalarArray lowerb1 = new ScalarArray(new MCvScalar(0, 10, 180));

            ScalarArray upperb1 = new ScalarArray(new MCvScalar(50, 160, 255));

            Mat dst = new Mat();

            //使用InRange分离颜色,返回二值图

            CvInvoke.InRange(hsv, lowerb1, upperb1, dst);

            ImageBox2.Image = dst;

            Mat dstchannel3 = new Mat();

            //转为3通道图像

            CvInvoke.CvtColor(dst, dstchannel3, ColorConversion.Gray2Bgr);

            Mat result = new Mat();

            //And运算,然后显示分离结果

            CvInvoke.BitwiseAnd(m, dstchannel3, result);

            ImageBox3.Image = result;

        }

运行后如下图所示:

 

图4-6 InRange方法分离出人脸

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

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

相关文章

WebRTC音视频开发读书笔记(五)

WebRTC既可以收发音频和视频,还可以传输其它数据,如短消息、二进制数据、文本数据等。可以实现文本聊天、文件传输等场景。 八、数据通道 1、基本概念 WebRTC的数据通道好比高速公路、文本、文件、图像以及其它数据 好比货物,通道打通 &am…

SpringBoot Web请求、响应

一、文章概述 请求方面主要讲,当前端向后端发出请求时,对于不同类型的参数后端都如何接收;对于响应,文章会讲解后端如何向前端响应数据以及如何使返回的数据具有统一的格式。 二、请求 2.1接收简单参数 Controller方法&#xf…

sqlserver的openquery配置

1.命令Demo ---openquery--开启Ad Hoc Distributed Queries组件,在sql查询编辑器中执行如下语句exec sp_configure show advanced options,1reconfigureexec sp_configure Ad Hoc Distributed Queries,1reconfigure--关闭Ad Hoc Distributed Queries组件&#xff0…

10、stm32实现adc读取数据

一、配置 二、代码 /* USER CODE BEGIN 2 */OLED_Init();OLED_Clear();OLED_ShowString(0,0,"Hello adc",12,0);uint16_t adc_number 0;/* USER CODE END 2 *//* USER CODE BEGIN WHILE */while (1){HAL_ADC_Start(&hadc1);HAL_ADC_PollForConversion(&hadc1…

2分钟搭建一个简单的WebSocket服务器

你好同学,我是沐爸,欢迎点赞、收藏和关注。个人知乎 如何用2分钟在本地搭建一个简单的 WebSocket 服务器?其实使用 Node.js,加上一些流行的库,是很容易实现的。前端同学通过自己搭建 WebSocket 服务器,对于…

PyTorch深度学习快速入门教程--学习笔记

目录 P4 PyCharm和Jupyter的对比 P5 PyTorch加载数据 P6 Dataset类代码实现 P7 Tensorboard 写日志 读取日志文件 Tensorboard 读图片 P10 Transforms使用 Transforms用途 常见的Transforms工具 P14 torchvision数据集使用 P15 Dataloader使用 P16 nn.Module模块使…

政务大数据解决方案(三)

政务大数据解决方案致力于通过整合来自不同部门和领域的海量数据,采用先进的数据分析技术与人工智能算法,建立一个全面、高效的数据管理平台,从而优化政府决策过程,提高政策制定的科学性与精准性。该方案涵盖数据采集、存储、处理…

C语言学习笔记 Day14(文件管理)

Day14 内容梳理: 目录 Chapter 10 文件操作 10.0 概述 10.1 打开、关闭文件 (1)文件指针 (2)打开文件 fopen() (3)读取文件 fgetc() (4)写入文件 fputc() Ch…

Arthas:Java应用诊断利器

1、简介 Arthas 是一款线上监控诊断产品,通过全局视角实时查看应用 load、内存、gc、线程的状态信息,并能在不修改应用代码的情况下,对业务问题进行诊断,包括查看方法调用的出入参、异常,监测方法执行耗时&#xff0c…

【大数据算法】一文掌握大数据算法之:概述、特点、类型及难点等,值得收藏。

大数据算法概述 1、引言2、大数据算法概述2.1 什么是大数据算法2.2 大数据算法特点2.3 大数据算法类型2.4 大数据算法难点 3、总结 1、引言 小屌丝:鱼哥,大数据开篇反馈不错哦。 小鱼:嗯,是的呢, 咱这个专栏&#xff…

Fly Catcher:通过监测恶意信号来检测飞机欺骗

Fly Catcher 的开发者 Angelina Tsuboi 是一名飞行员、网络安全研究员和发明家。 她决定着手一个将这三个不同兴趣结合起来的项目,以解决航空雷达系统的一个重大问题。 ADS-B 系统最初用于基本的飞机定位和跟踪,Tsuboi 对该系统的网络安全方面进行了深…

正点原子阿尔法ARM开发板-IMX6ULL(一)——环境安装和资源介绍

文章目录 一、环境安装二、主目录的资源介绍2.1 alpzha2.2 linux2.3 c_linux 三、QT四、交叉编译五、VScode六、其他6.1 SecureCRT6.2 Putty6.3 MobaXterm6.4 NFS6.5 TFTP 这几天实习的强度下来了,就来看看嵌入式方面的知识了 也是买了正点原子的阿尔法的嵌入式开发…

一次日志记录中使用fastjson涉及到ByteBuffer的教训

背景 目前本人在公司负责的模块中,有一个模块是负责数据同步的,主要是将我们数据产线使用的 AWS Dynamodb 同步的我们的测试QA 的环境的 MongoDB 的库中,去年开始也提供了使用 EMR 批量同步的功能,但是有时候业务也需要少量的数据…

Linux内核分析(RCU机制和内存优化)

文章目录 前言一、RCU概念RCU 的基本概念1. **如何工作**2. **RCU 的工作流程** RCU 的主要优势RCU 的使用场景RCU 的挑战和局限RCU 的实现总结 二、RCU对链表的访问三、Linux中的屏障主要类型应用场景实现作用用途 前言 一、RCU概念 RCU(Read-Copy-Update&#x…

【Web】巅峰极客2024 部分题解

目录 EncirclingGame GoldenHornKing php_online admin_Test EncirclingGame 玩赢游戏就行 GoldenHornKing 利用点在传入的app 可以打python内存马 /calc?calc_reqconfig.__init__.__globals__[__builtins__][exec](app.add_api_route("/flag",lambda:__i…

【数据结构】二叉树(三)精选Oj题

本篇已经是二叉树第三篇啦,下面讲解相关面试题,写作不易,求路过的朋友给个点赞与收藏呀~ 目录 1、相同的树 2、另一颗树的子树 3、翻转二叉树 4、对称二叉树 5、平衡二叉树 6、构建二叉树 7、二叉树的最近公共祖先 孩子双亲解法 二叉…

企业为何需要渗透测试

随着数字化时代的全面到来,互联网已成为企业运营不可或缺的一部分。然而,日益复杂的网络环境和不断演变的攻击手段,使得网络安全问题日益严峻。在这一背景下,渗透测试作为一种重要的安全评估手段,对于保障企业信息安全…

day24-测试之接口测试基础

目录 一、接口的定义 二、接口的优点 三、API接口 四、接口测试流程 五、网络基础概念 六、HTTP和RURL 七、get和post请求 八、数据格式 九、状态码 十、restful风格 十一、接口工具 一、接口的定义 程序之间协作所要遵循的一套规范、标准 二、接口的优点 2.1.责任…

探索和表征大型语言模型在嵌入式系统开发和调试中的应用

这篇论文的标题是《Exploring and Characterizing Large Language Models for Embedded System Development and Debugging》,作者是来自华盛顿大学的研究团队。论文主要探讨了大型语言模型(LLMs)在嵌入式系统开发和调试方面的应用潜力。以下…

前端技巧——复杂表格在html当中的实现

应用场景 有时候我们的表格比较复杂,表头可能到处割裂,我们还需要写代码去完成这个样式,所以学会在原生html处理复杂的表格还是比较重要的。 下面我们来看这一张图: 我们可以看到有些表头项的规格不太一样,有1*1 2*…