当前位置: 首页 > 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…...

【Linux】shell脚本忽略错误继续执行

在 shell 脚本中,可以使用 set -e 命令来设置脚本在遇到错误时退出执行。如果你希望脚本忽略错误并继续执行,可以在脚本开头添加 set e 命令来取消该设置。 举例1 #!/bin/bash# 取消 set -e 的设置 set e# 执行命令,并忽略错误 rm somefile…...

【Oracle APEX开发小技巧12】

有如下需求: 有一个问题反馈页面,要实现在apex页面展示能直观看到反馈时间超过7天未处理的数据,方便管理员及时处理反馈。 我的方法:直接将逻辑写在SQL中,这样可以直接在页面展示 完整代码: SELECTSF.FE…...

Day131 | 灵神 | 回溯算法 | 子集型 子集

Day131 | 灵神 | 回溯算法 | 子集型 子集 78.子集 78. 子集 - 力扣(LeetCode) 思路: 笔者写过很多次这道题了,不想写题解了,大家看灵神讲解吧 回溯算法套路①子集型回溯【基础算法精讲 14】_哔哩哔哩_bilibili 完…...

Qt Widget类解析与代码注释

#include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this); }Widget::~Widget() {delete ui; }//解释这串代码,写上注释 当然可以!这段代码是 Qt …...

聊聊 Pulsar:Producer 源码解析

一、前言 Apache Pulsar 是一个企业级的开源分布式消息传递平台,以其高性能、可扩展性和存储计算分离架构在消息队列和流处理领域独树一帜。在 Pulsar 的核心架构中,Producer(生产者) 是连接客户端应用与消息队列的第一步。生产者…...

最新SpringBoot+SpringCloud+Nacos微服务框架分享

文章目录 前言一、服务规划二、架构核心1.cloud的pom2.gateway的异常handler3.gateway的filter4、admin的pom5、admin的登录核心 三、code-helper分享总结 前言 最近有个活蛮赶的,根据Excel列的需求预估的工时直接打骨折,不要问我为什么,主要…...

[ICLR 2022]How Much Can CLIP Benefit Vision-and-Language Tasks?

论文网址:pdf 英文是纯手打的!论文原文的summarizing and paraphrasing。可能会出现难以避免的拼写错误和语法错误,若有发现欢迎评论指正!文章偏向于笔记,谨慎食用 目录 1. 心得 2. 论文逐段精读 2.1. Abstract 2…...

将对透视变换后的图像使用Otsu进行阈值化,来分离黑色和白色像素。这句话中的Otsu是什么意思?

Otsu 是一种自动阈值化方法,用于将图像分割为前景和背景。它通过最小化图像的类内方差或等价地最大化类间方差来选择最佳阈值。这种方法特别适用于图像的二值化处理,能够自动确定一个阈值,将图像中的像素分为黑色和白色两类。 Otsu 方法的原…...

华为OD机试-食堂供餐-二分法

import java.util.Arrays; import java.util.Scanner;public class DemoTest3 {public static void main(String[] args) {Scanner in new Scanner(System.in);// 注意 hasNext 和 hasNextLine 的区别while (in.hasNextLine()) { // 注意 while 处理多个 caseint a in.nextIn…...

【论文阅读28】-CNN-BiLSTM-Attention-(2024)

本文把滑坡位移序列拆开、筛优质因子,再用 CNN-BiLSTM-Attention 来动态预测每个子序列,最后重构出总位移,预测效果超越传统模型。 文章目录 1 引言2 方法2.1 位移时间序列加性模型2.2 变分模态分解 (VMD) 具体步骤2.3.1 样本熵(S…...