opencv二值化详解

news2024/11/20 2:32:33

 

大家好,今天来跟大家讲讲 opencv二值化。 先从一个比较经典的方法开始讲解,看 opencv官方文档: 二值化(binary)的定义:在一个输入图像中,将其一个像素点设置为0,将其两个像素点设置为1。 二值化可以使图像中的每个像素值都被指定为0或1。在二值化之前,每个像素都是灰度的。 二值化是图像处理中最常用的方法之一,它的目的是将一个像素点从灰度图像转变成彩色图像。可以说二值化是一种常用的图像处理技术。 我们先来看下 opencv官方文档的方法: 从上面这段话,我们可以看到,对于一幅图片来说,二值化后需要先对图片进行归一化,然后再转换成彩色图像。 在 opencv官方文档中,把二值化分为三个步骤: 1、归一化图像; 2、转换为彩色图像; 我们先来看下二值化的定义:

  • 1、归一化图像

    归一化图像主要是为了解决在二值化过程中,因为光照变化或者像素颜色不一致而产生的影响,从而使得图像的像素点的灰度大小一致,以方便后期二值化操作。 在 opencv官方文档中,对于一个物体来说,其像素点可以按照以下方式来设置: 这种设置方式就是我们平时说的归一化图像,那么这里有个问题,就是如果物体中包含了多个像素点怎么办?为了解决这个问题,在 opencv官方文档中给出了一个简单的处理方法: 通过这个方法,我们可以对物体进行归一化。这个方法的思路非常简单,就是将物体中所有的像素点进行统一处理。 这种归一化方式对于物体中包含多个像素点来说是非常好的,因为在二值化过程中,需要对图像进行运算,如果每个像素点的颜色不一样,就会导致运算结果不一致。当然了,这个方法是有限制条件的: 1、物体中包含的像素点必须是灰度大小一致; 2、图像必须是一个黑色像素点和一个白色像素点组成;

  • 2、转换为彩色图像

    前面的归一化图像,相当于把原图的灰度信息去掉了,为后面的颜色信息做准备。那么这里就需要对原图进行一些处理,比如加个色标之类的。这样做主要是为了避免二值化过程中,因为像素点颜色不同而造成的误差,所以这步很关键。 在 opencv中有一个opencv_color方法,使用它可以将输入图片转换成彩色图像。opencv_color方法会对图片进行一些处理,比如设置一个阈值,这个阈值就是图像中的灰度值与要转换成彩色图像的灰度之间的差。如果阈值不是零,那么该像素将被转换为颜色。 下面就来看看这个方法如何处理图片: 1、首先我们将图片保存下来。为了方便后面使用,我们在保存之前先进行一次缩放处理。因为图片是 jpg格式,所以我们首先要打开它。 2、然后打开一个新文件,先保存到其他位置: 3、最后我们打开转换好的 color文件,看看效果如何: 4、然后我们就可以在 opencv中调用这个方法来实现图片的二值化了。 下面看一个简单的例子: 上面是一个比较经典的二值化演示代码: 这个例子其实是有一个特殊点的:由于图像是黑白图像,所以我们只需要先把颜色降成黑白就可以了。但是对于很多情况下,我们需要把一幅图像转换成彩色图像。例如在人脸识别中,我们可能需要把人脸转化成彩色图像(因为人脸是彩色的);在视频监控中我们可能需要把视频转换成彩色图像(因为视频是黑白的);所以大家可以看到这个方法的处理过程还是比较复杂的。

  • 3、把归一化图像转换成彩色图像

    对图像进行归一化是为了消除噪声,使图像更清晰。归一化后,我们就可以开始把图片转换成彩色图像了。 关于二值化, opencv官方文档给出了两种方法: (1)、基于灰度的方法: 这种方法是用像素值的范围来判断一个像素是否属于一个颜色通道,从而把像素值从灰度图像转换成彩色图像。在这种方法中,我们会得到两个分别用0和1表示的值:0代表是黑色,1代表是白色。颜色通道的选择会根据图像中每个像素的灰度值来决定,因此也被称为灰度图。 这种方法将图像分成了三个颜色空间,分别为 RGB (红、绿、蓝)、 HSV (红和 YCbCr (红、蓝)。这种方法实际上是把图像中每个像素点的值都看作是三个颜色空间中的一个,所以也被称为彩色图。 对于灰度图来说,它不能反映出图像的真实颜色,而将灰度图转换为彩色图是为了利用图像中每个像素点的颜色信息来处理图像。 一般情况下,在进行图像处理时会对灰度和彩色图像分别进行处理。 从上面两种方法可以看出,通过转换之后,两种方法得到的结果都是彩色图。

  • 4、把归一化后的彩色图像转换成二值图像

    上面是一个很经典的方法,下面我们来看下具体步骤: 1、选择图像区域:要处理的图像,即需要二值化的区域,选择一个最大值或者最小值; 2、对图像进行归一化:首先要对图像进行归一化,从上面的图片可以看到,归一化后的图片就变成了彩色图像了,所以我们需要先将原图进行归一化处理; 3、将归一化后的图片转换为二值图像:这个步骤很重要,因为 opencv只支持2*2、4*4等比较大的二值化区域,所以我们需要将归一化后的图片转换为二值图像; 4、用彩色图像处理二值化:大家应该都知道,彩色图像的像素点是由红绿蓝三个颜色构成,而我们在处理二值化时,将像素点转换为 RGB值(红绿蓝三个颜色),这样就完成了对图片的二值化,下面是具体步骤: 5、用 RGB图像处理二值化:前面几个步骤已经完成了对图片进行了归一化处理,所以我们现在需要把图片转换为 RGB值(红绿蓝三个颜色),再用同样的方法对 RGB图像进行二值化处理; 7、最后对图片进行裁剪:把图片中不需要的部分裁剪掉;

  • 5、将二值图像转换为像素点的灰度值

    如果将二值图像转换为像素点的灰度值,那么这个过程就叫做转换。转换的过程与归一化过程相反,是先将图像转换为灰度值,然后再将其转换为像素点的灰度值。 通过上面这段代码,我们可以看到,要把图片转换为像素点的灰度值,首先是要把图片转换成 RGB颜色空间,然后再用 opencv进行处理,这里就需要调用 opencv库的 image.plot_binary ()函数了。 这段代码中我们使用了一个新的方法来进行灰度值的计算: 在这里我们要用到 opencv中的 image.plot_binary ()函数,这个函数的作用是计算像素点灰度值。

以下是几个常用的OpenCV二值化代码示例:

1. 全局阈值二值化:
```python
import cv2
img = cv2.imread('image.jpg', 0)
_, thresh = cv2.threshold(img, 127, 255, cv2.THRESH_BINARY)
cv2.imshow('image', img)
cv2.imshow('threshold', thresh)
cv2.waitKey(0)
cv2.destroyAllWindows()
```
2. 自适应阈值二值化:
```python
import cv2
img = cv2.imread('image.jpg', 0)
thresh = cv2.adaptiveThreshold(img, 255, cv2.ADAPTIVE_THRESH_MEAN_C, cv2.THRESH_BINARY, 11, 2)
cv2.imshow('image', img)
cv2.imshow('adaptive threshold', thresh)
cv2.waitKey(0)
cv2.destroyAllWindows()
```
3. Otsu二值化:
```python
import cv2
img = cv2.imread('image.jpg', 0)
_, thresh = cv2.threshold(img, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)
cv2.imshow('image', img)
cv2.imshow('Otsu threshold', thresh)
cv2.waitKey(0)
cv2.destroyAllWindows()
```
这些示例代码可以根据需要进行修改和调整,以适应不同的图像处理任务。

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

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

相关文章

开发笔记之:文件读取值溢出bug分析(QT C++版)

(1)引言 以下是QT C读取数据文件(QDataStream)的代码: /*** 按双字读取* param fis 文件输入流* param isBigEndian 是否大头(字节序)* return 双字值*/ DWORD FsFileUtil::readAsD…

怎么用问卷工具做市场调研?

对于希望开发新产品或服务、拓展新市场或确定潜在客户的公司来说,市场调查是一个至关重要的过程。然而,进行市场调查可能既耗时又昂贵,特别是在涉及对大量人群进行调查的情况下。今天,小编将来聊一聊调查问卷工具如何帮助企业进行…

微信小程序-基础知识

文章目录 AppIdOpenIDUnionId处理方法session_key AppId appid 是微信账号的唯一标识,这个是固定不变的; 如果了解微信公众号开发的就需要注意一下,小程序的appid 和 公众号的appid 是不一致的 OpenID 为了识别用户,每个用户针…

如何成为自动化测试工程师?8年测试总结,自动化测试岗晋升的技能...

目录:导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结(尾部小惊喜) 前言 Python自动化测试&…

程序设计入门——C语言2023年5月18日

程序设计入门——C语言 第二周 计算表达式 课程来源:链接: 浙江大学 翁恺 程序设计入门——C语言 学习日期:2023年5月18日 第二周 计算 表达式 有两个变量a和b,交换a和b的值。 老师举例:有两杯液体,一杯茶&#xff…

03)FastDFS配置nginx 服务,使用http方式访问图片

FastDFS是没有文件访问功能的,需要借助其他工具实现图片HTTP访问的。 没安装nginx时比如前端html网页想获取 FastDFS的一张图片显示,需要java写个controller,然后使用 FastDFS-java client客户端调用文件获取api,HttpServletResponre在返回图片流.给前端显示。 安装了nginx…

HTTP介绍、原理

HTTP 与 HTTPS 有哪些区别? HTTP 是超文本传输协议,信息是明文传输,存在安全风险的问题。HTTPS 则解决 HTTP 不安全的缺陷,在 TCP 和 HTTP 网络层之间加入了 SSL/TLS 安全协议,使得报文能够加密传输。HTTP 连接建立相…

带头 双向 循环 链表——C语言实现

既然有带头 那么就有不带头 为什么我要将带头 而不讲不带头? 在之前我讲单链表时就说过 如果不带头会出现讨论的情况 为什么会出现讨论的情况 假设链表有一个节点 进行尾插 就只是将新的节点连接到链表的尾节点之后 那么如果链表没有节点 就没有尾节点 自然也就不能…

网络编程 (一)网络协议TCP,UDP

文章目录 🐒个人主页🏅JavaSE系列专栏📖前言:🎀计算机网络概述🎀网络编程🎀那么是如何精确找到计算机网络中的目标主机呢?🎀网络模型🎀TCP协议🎀U…

GitLAB CI-CD语法

GitLAB CI-CD语法 目录 1、Pipeline核心语法 gitlab-ci语法: https://docs.gitlab.com/ee/ci/yaml/ stages 阶段控制 .pre阶段的作业总是在流水线开始时执行;.post阶段的作业总是在流水线结束时执行; CI代码: stages:- build…

Servlet的详解

Servlet 的主要工作 允许程序员注册一个类,在 Tomcat 收到的某个特定的 HTTP 请求的时候,执行这个类中的一些代码 帮助程序员解析 HTTP 请求,把 HTTP 请求从一个字符串解析成一个 HttpRequest 对象 帮助程序员构造 HTTP 响应,程序…

用 CSS 自定义滚动条

简介 首先需要介绍一下滚动条的组成部分。滚动条包含 track 和 thumb&#xff0c;如下图所示&#xff1a; track是滚动条的基础&#xff0c;其中的 thumb是用户拖动支页面或章节内的滚动。 案例&#xff1a; 案例代码&#xff1a; <!DOCTYPE html> <html><he…

python 递归下降分析法的设计与实验原理 编译原理

本文内容&#xff1a; 本文章实现的文法&#xff1a; E->T|ET; T->F|T*F; F->i|(E);利用上一篇文章&#xff1a;python 预备实验2 LL(1)文法构造转化后的输出&#xff1a; E->TE; T->FT; F->i|(E); E->TE|; T->*FT|; 手工测试&#xff0c;是LL(1)文…

Flink+Pulsar、Kafka问题分析及方案 -- 事务阻塞

Pulsar、Kafka的事务设计 Pulsar跟Kafka在设计事务功能时&#xff0c;在消费者读取消息的顺序方面&#xff0c;都采用了类似的设计。 比如说&#xff0c;先创建txn1&#xff0c;然后创建txn2&#xff0c;这两个事务生产消息到同一个topic/partition里&#xff0c;但是txn2比tx…

【前端知识】常见的加密算法介绍

【前端知识】常见的加密算法介绍 1 常见的加密算法&#xff08;1&#xff09;哈希函数&#xff08;2&#xff09;对称加密&#xff08;3&#xff09;非对称加密&#xff08;4&#xff09;消息认证码&#xff08;MAC&#xff09; 2.总结 1 常见的加密算法 略微介绍一下前端中常…

Kerberos

序言 kerberos 除了说帮我们验证Java程序是否具有权限来请求Hadoop的服务,也可以来帮助我们检查新增的节点是是否是真实的节点,还是黑客为了套取数据的节点. 比如为HDFS新增一个DataNode节点,如果没有Kerberos验证, 随便一个节点只要连接上NameNode就会存储数据,黑客就可以获…

LeetCode:23. 合并 K 个升序链表

23. 合并 K 个升序链表 1&#xff09;题目2&#xff09;过程3&#xff09;代码1. 最开始2.初步优化 4&#xff09;结果1. 最开始2. 初步优化 1&#xff09;题目 给你一个链表数组&#xff0c;每个链表都已经按升序排列。 请你将所有链表合并到一个升序链表中&#xff0c;返回合…

机器学习基础认识(一)

机器学习应用 机器学习的应用&#xff0c;主要分为两类&#xff1a;预测、分类 预测&#xff0c;一般是指&#xff1a;根据数据&#xff0c;预测数值 分类&#xff0c;一般是指&#xff1a;根据数据&#xff0c;进行分类 预测与分类的关系【个人理解】 分类&#xff0c;本质…

零基础怎么入门网络安全?看这篇就够啦!

由于我之前写了不少网络安全技术相关的故事文章&#xff0c;不少读者朋友知道我是从事网络安全相关的工作&#xff0c;于是经常有人在微信里问我&#xff1a; 我刚入门网络安全&#xff0c;该怎么学&#xff1f;要学哪些东西&#xff1f;有哪些方向&#xff1f;怎么选&#xff…

Centos7.6部署postgresql15主从

目录 安装pg15&#xff08;master和standby&#xff09;主数据库配置(master)初始化数据库创建归档日志目录设置数据库访问权限修改数据库配置文件开启数据库 从数据库配置(standby)同步主库的数据文件创建文件standby.signal启动从数据库 主从状态验证master上验证standby上验…