当前位置: 首页 > news >正文

opencv-27 阈值处理 cv2.threshold()

怎么理解阈值处理?

阈值处理(Thresholding)是一种常用的图像处理技术,在机器学习和计算机视觉中经常被用于二值化图像或二分类任务。它基于设定一个阈值来将像素值进行分类,将像素值大于或小于阈值的部分分为两个不同的类别,从而得到二值化的图像或进行二分类预测。

在图像处理中的阈值处理:

图像二值化:将灰度图像转换为二值图像,其中像素值大于或等于阈值的部分设为一个值(通常为255),而小于阈值的部分设为另一个值(通常为0)。
自适应阈值处理:根据图像局部的灰度特点来自动调整不同区域的阈值,适应图像的不同部分。

在二分类任务中的阈值处理:

对于分类模型的输出概率:将模型输出的概率值与阈值进行比较,大于阈值的样本被划分为一个类别,小于阈值的样本被划分为另一个类别。
对于回归模型的输出:将模型输出的连续值与阈值进行比较,大于阈值的样本被划分为一个类别,小于阈值的样本被划分为另一个类别。

阈值处理的应用场景

  1. 图像二值化:将灰度图像转换为二值图像,常用于图像分割、边缘检测、形态学运算等图像处理任务。
  2. 自适应阈值处理:根据图像局部的灰度特点来自动调整不同区域的阈值,适应图像的不同部分。适用于光照不均匀或对比度变化较大的图像。
  3. 目标检测中的二分类:在目标检测任务中,通常需要将模型输出的概率值转换为二分类结果,判断目标是否存在。
  4. 人脸识别和人脸表情分析:在人脸图像处理中,可以通过阈值处理来检测和分析人脸的不同表情或情绪。
  5. 图像分割:将图像分为多个区域,常用于图像分析、目标提取和图像理解等任务。
  6. 文字识别和OCR(光学字符识别):在文字识别任务中,可以通过阈值处理将图像中的文字部分提取出来,便于后续识别过程。
  7. 遥感图像处理:在遥感图像中,阈值处理可以用于土地覆盖分类、植被检测等应用。
  8. 信号处理:在信号处理中,可以通过阈值处理来检测信号的起始点或结束点,以及滤除噪声。
  9. 异常检测:在异常检测任务中,可以使用阈值处理来识别异常点或异常事件。
  10. 机器学习中的二分类问题:在机器学习中,对于二分类任务,可以通过设定阈值来将模型输出的概率值转换为类别标签。

OpenCV 提供了函数 cv2.threshold()和函数 cv2.adaptiveThreshold(),用于实现阈值处理

threshold 函数

OpenCV 3.0 使用 cv2.threshold()函数进行阈值化处理,该函数的语法格式为:

retval, dst = cv2.threshold( src, thresh, maxval, type )

式中:
 retval 代表返回的阈值。
 dst 代表阈值分割结果图像,与原始图像具有相同的大小和类型。
 src 代表要进行阈值分割的图像,可以是多通道的,8 位或 32 位浮点型数值。
 thresh 代表要设定的阈值。
 maxval 代表当 type 参数为 THRESH_BINARY 或者 THRESH_BINARY_INV 类型时,需要设定的最大值。
 type 代表阈值分割的类型,具体类型值如表 6-1 所示。

在这里插入图片描述
上述公式相对抽象,可以将其可视化,具体如图 6-2 所示。

在这里插入图片描述

二值化阈值处理(cv2.THRESH_BINARY)

二值化阈值处理会将原始图像处理为仅有两个值的二值图像,其示意图如图 6-3 所示。其
针对像素点的处理方式为:

  • 对于灰度值大于阈值thresh的像素点,将其灰度值设定为最大值。
  • 对于灰度值小于或等于阈值thresh的像素点,将其灰度值设定为 0

在这里插入图片描述
如果使用表达式表示,其目标值的产生规则为:

在这里插入图片描述
式中,thresh是选定的特定阈值。

在 8 位图像中,最大值是 255。因此,在对 8 位灰度图像进行二值化时,如果将阈值设定
为 127,那么:

  • 所有大于 127 的像素点会被处理为 255。
  • 其余值会被处理为 0。

为了方便,在后续说明中,我们都以 8 位图像为例,即像素值最大值为 255。

实验:使用函数 cv2.threshold()对数组进行二值化阈值处理,观察处理结果

import cv2
import numpy as np
img=np.random.randint(0,256,size=[4,5],dtype=np.uint8)t,rst=cv2.threshold(img,127,255,cv2.THRESH_BINARY)
print("img=\n",img)
print("t=",t)
print("rst=\n",rst)

运行结果:

img=[[235  26  81   7 121][ 81  82  15  64  40][156 250 246  30 226][136 202 129 243  65]]
t= 127.0
rst=[[255   0   0   0   0][  0   0   0   0   0][255 255 255   0 255][255 255 255 255   0]]

实验2:使用函数 cv2.threshold()对图像进行二值化阈值处理

import cv2
img=cv2.imread("lena.png")
#将图像转换为灰度图像
img=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
t,rst=cv2.threshold(img,127,255,cv2.THRESH_BINARY)
cv2.imshow("img",img)
cv2.imshow("rst",rst)
cv2.waitKey()
cv2.destroyAllWindows()

运行结果:

在这里插入图片描述
左图是原始图像,右图是二值化阈值处理结果。

反二值化阈值处理(cv2.THRESH_BINARY_INV)

反二值化阈值处理的结果也是仅有两个值的二值图像,与二值化阈值处理的区别在于,二
者对像素值的处理方式不同。反二值化阈值处理针对像素点的处理方式为:
 对于灰度值大于阈值的像素点,将其值设定为 0。
 对于灰度值小于或等于阈值的像素点,将其值设定为 255。

反二值化阈值处理方式的示意图如图 6-5 所示。

在这里插入图片描述
如果使用表达式来表示,其目标值的产生规则为:

在这里插入图片描述
式中,thresh 是选定的阈值.

实验3:使用函数 cv2.threshold()对数组进行反二值化阈值处理

import cv2
import numpy as np
img=np.random.randint(0,256,size=[4,5],dtype=np.uint8)
t,rst=cv2.threshold(img,127,255,cv2.THRESH_BINARY_INV)
print("img=\n",img)
print("t=",t)
print("rst=\n",rst)

运行程序,结果如下所示:

img=
[[ 56 64 150 48 41]
[108 165 112 213 110]
[122 244 10 213 46]
[247 30 90 0 26]]
t= 127.0
rst=
[[255 255 0 255 255]
[255 0 255 0 255]
[255 0 255 0 255]
[ 0 255 255 255 255]]

大于127的置为0,小于127的置为255

后面还有

截断阈值化处理(cv2.THRESH_TRUNC)
超阈值零处理(cv2.THRESH_TOZERO_INV)
低阈值零处理(cv2.THRESH_TOZERO)

感兴趣的同学自己去多实操几遍

相关文章:

opencv-27 阈值处理 cv2.threshold()

怎么理解阈值处理? 阈值处理(Thresholding)是一种常用的图像处理技术,在机器学习和计算机视觉中经常被用于二值化图像或二分类任务。它基于设定一个阈值来将像素值进行分类,将像素值大于或小于阈值的部分分为两个不同的类别&…...

AAOS 音频焦点请求

文章目录 前言基本概念提供给应用来获取音频焦点的apiAAOS中的音频焦点管理交互矩阵duck的实现流程AAOS 测试应用kitchensink焦点相关 前言 本文章的目标是首先了解Android中音频焦点的基本概念,理解代码中相关音频焦点的使用方法。其次理解AAOS 中相关交互矩阵概念…...

订单系统中的幂等实现

一.订单提交的例子 一个订单生成并支付的过程,大致为:用户点击前端页面提交订单->后端根据此次提交信息生成订单->用户确认订单并进行支付操作->支付成功。 主要分为前端层面,后端系统层面,数据库层面。前端层面不详述…...

三个常用查询:根据用户名 / token查询用户信息+链表分页条件查询

目录 1.根据用户名或者token查询用户信息 会员信息实体类 统一状态Result类 controller层 service层及实现类 dao层 测试: 2.链表分页条件查询 会员等级实体类 封装条件类PageVo controller层 service层及实现类 dao层 Mapper.xml层 测试 vue前端参考 1.根据用户名…...

列表、张量、向量和矩阵的关系

在数学和编程中,列表、张量、向量和矩阵之间有一定的关系。这些概念在不同领域和语境中有略微不同的定义和用法,以下是它们之间的一般关系: 列表(List): 列表是编程语言中的一种数据结构,用于存…...

华为数通HCIP-ISIS高级

isis区域间的互访 1、L2区域 to L1区域 在L1区域发布的路由会以L1-LSP在L1区域内传递,到达L1-2路由器时,L1-2路由器会将该L1-LSP转换为L2-LSP在L2区域内传递; 因此L2区域的设备可以学习到L1区域的明细路由,进行访问;…...

CorelDraw怎么做立体字效果?CorelDraw制作漂亮的3d立体字教程

1、打开软件CorelDRAW 2019,用文本工具写上我们所需要的大标题。建议字体选用比较粗的适合做标题的字体。 2、给字填充颜色,此时填充的颜色就是以后立体字正面的颜色。我填充了红色,并加上了灰色的描边。 3、选中文本,单击界面左侧…...

大致了解Redis

为了保证数据的可靠性,Redis 需要在磁盘上读写 AOF 和 RDB,但在高并发场景里,这就会直接带来两个新问题:一个是写 AOF 和RDB 会造成 Redis 性能抖动,另一个是 Redis 集群数据同步和实例恢复时,读 RDB 比较慢…...

javaweb会话技术

cookie的入门使用 package com.hspedu.cookie;import javax.servlet.ServletException; import javax.servlet.http.Cookie; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import …...

android app控制ros机器人三(android登录界面)

接下来是二次开发的具体环节了,由于存在用户需求,用到ros-mobile不多,更偏向于android开发。 用ppt画了简单的展示界面,与用后交流界面的功能布局。先开发一代简易版本的app,后续可以丰富完善。ctrlcv上线。 登录界面…...

Android版本的发展4-13

Android 4.4 KitKat 1、通过主机卡模拟实现新的 NFC 功能。 2、低功耗传感器,传感器批处理,步测器和计步器。 3、全屏沉浸模式,隐藏所有系统 UI,例如状态栏和导航栏。它适用于鲜艳的视觉内容,例如照片、视频、地图、…...

【2023.7.29】浅谈手办——新人入坑指南

目录 前言入坑指南1.声明2.介绍3.树状图 总结参考文章 前言 出于对动漫的热爱,相信很多人都会买手办,本人在大一时开始入手了第一个手办,超大猿王路飞(高约50cm),当时对手办还不是很了解,只知道…...

使用贝叶斯算法完成文档分类问题

贝叶斯原理 贝叶斯原理(Bayes theorem)是一种用于计算条件概率的数学公式。它是以18世纪英国数学家托马斯贝叶斯(Thomas Bayes)的名字命名的。贝叶斯原理表达了在已知某个事件发生的情况下,另一个事件发生的概率。具体…...

【Kafka】消息队列Kafka进阶

目录 Kafka分区机制生产者分区写入策略轮询策略随机策略(不用)按key分配策略乱序问题自定义分区策略 消费者组Rebalance机制消费者分区分配策略Range范围分配策略RoundRobin轮询策略Stricky粘性分配策略 Kafka副本机制producer的ACKs参数acks配置为0acks…...

学习day55

消息订阅与发布 消息订阅与发布是一种组件间通信的方式,适用于任意组件间通信 使用步骤: 安装pubsub:npm i pubsub-js 引入:import pubsub from pubsub-js 接收数据:A组件想接收数据,则在A组件中订阅消息…...

C++-Rust-一次性掌握两门语言

C-Rust-一次性掌握两门语言 简介特色数据类型声明常量、变量判断与循环函数抽象化的对象:类与接口枚举模板与泛型Lambda匿名函数表达式 简介 本文主要是通过介绍C和Rust的基础语法达成极速入门两门开发语言。 C是在C语言的基础之上添加了面向对象的类、重载、模板等…...

汇编调用C语言定义的全局变量

在threadx移植中,系统的systick通过了宏定义的方式定义,很难对接库函数的时钟频率,不太利于进行维护 所以在C文件中自己定义了一个systick_Div的变量,通过宏定义方式设定systick的时钟频率 在汇编下要加载这个systick分频系数 …...

WEB 文件包含 /伪协议

首先谈谈什么是文件包含 WEB入门——文件包含漏洞与PHP伪协议_文件包含php伪协议_HasntStartIsOver的博客-CSDN博客 文件包含 程序员在编写的时候 可能写了自己的 函数 如果想多次调用 那么就需要 重新写在源代码中 太过于麻烦了只需要写入 funcation.php然后在需要引用的地…...

ComPDFKit PDF SDK库(支持Windows、Web、Android、iOS、Mac等平台)

ComPDFKit提供专业、全平台支持的PDF开发库,包括Windows、Mac、Linux、Android、iOS、Web平台。开发者可以快速、灵活整合PDF功能到各开发平台的软件、程序、系统中。丰富的功能,多种开发语言,灵活的部署方案可供选择,满足您对PDF…...

微服务契约测试框架-Pact

契约测试 契约测试的思想就是将原本的 Consumer 与 Provider 间同步的集成测试,通过契约进行解耦,变成 Consumer 与 Provider 端两个各自独立的、异步的单元测试。 契约测试的优点: 契约测试与单元测试以及其它测试之间没有重复&#xff0c…...

未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?

编辑:陈萍萍的公主一点人工一点智能 未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?RWM通过双自回归机制有效解决了复合误差、部分可观测性和随机动力学等关键挑战,在不依赖领域特定归纳偏见的条件下实现了卓越的预测准…...

【kafka】Golang实现分布式Masscan任务调度系统

要求: 输出两个程序,一个命令行程序(命令行参数用flag)和一个服务端程序。 命令行程序支持通过命令行参数配置下发IP或IP段、端口、扫描带宽,然后将消息推送到kafka里面。 服务端程序: 从kafka消费者接收…...

椭圆曲线密码学(ECC)

一、ECC算法概述 椭圆曲线密码学(Elliptic Curve Cryptography)是基于椭圆曲线数学理论的公钥密码系统,由Neal Koblitz和Victor Miller在1985年独立提出。相比RSA,ECC在相同安全强度下密钥更短(256位ECC ≈ 3072位RSA…...

简易版抽奖活动的设计技术方案

1.前言 本技术方案旨在设计一套完整且可靠的抽奖活动逻辑,确保抽奖活动能够公平、公正、公开地进行,同时满足高并发访问、数据安全存储与高效处理等需求,为用户提供流畅的抽奖体验,助力业务顺利开展。本方案将涵盖抽奖活动的整体架构设计、核心流程逻辑、关键功能实现以及…...

Ascend NPU上适配Step-Audio模型

1 概述 1.1 简述 Step-Audio 是业界首个集语音理解与生成控制一体化的产品级开源实时语音对话系统,支持多语言对话(如 中文,英文,日语),语音情感(如 开心,悲伤)&#x…...

AI书签管理工具开发全记录(十九):嵌入资源处理

1.前言 📝 在上一篇文章中,我们完成了书签的导入导出功能。本篇文章我们研究如何处理嵌入资源,方便后续将资源打包到一个可执行文件中。 2.embed介绍 🎯 Go 1.16 引入了革命性的 embed 包,彻底改变了静态资源管理的…...

Springboot社区养老保险系统小程序

一、前言 随着我国经济迅速发展,人们对手机的需求越来越大,各种手机软件也都在被广泛应用,但是对于手机进行数据信息管理,对于手机的各种软件也是备受用户的喜爱,社区养老保险系统小程序被用户普遍使用,为方…...

Yolov8 目标检测蒸馏学习记录

yolov8系列模型蒸馏基本流程,代码下载:这里本人提交了一个demo:djdll/Yolov8_Distillation: Yolov8轻量化_蒸馏代码实现 在轻量化模型设计中,**知识蒸馏(Knowledge Distillation)**被广泛应用,作为提升模型…...

七、数据库的完整性

七、数据库的完整性 主要内容 7.1 数据库的完整性概述 7.2 实体完整性 7.3 参照完整性 7.4 用户定义的完整性 7.5 触发器 7.6 SQL Server中数据库完整性的实现 7.7 小结 7.1 数据库的完整性概述 数据库完整性的含义 正确性 指数据的合法性 有效性 指数据是否属于所定…...

C++课设:简易日历程序(支持传统节假日 + 二十四节气 + 个人纪念日管理)

名人说:路漫漫其修远兮,吾将上下而求索。—— 屈原《离骚》 创作者:Code_流苏(CSDN)(一个喜欢古诗词和编程的Coder😊) 专栏介绍:《编程项目实战》 目录 一、为什么要开发一个日历程序?1. 深入理解时间算法2. 练习面向对象设计3. 学习数据结构应用二、核心算法深度解析…...