06 OpenCV 阈值处理、自适应处理与ostu方法
1 基本概念
CV2中使用阈值的作用是将灰度图像二值化,即将灰度图像的像素值根据一个设定的阈值分成黑白两部分。阈值处理可以用于图像分割、去除噪声、增强图像对比度等多个领域。例如,在物体检测和跟踪中,可以通过对图像进行阈值处理来提取目标区域;在图像增强中,可以使用阈值处理来增强图像的轮廓和细节等。
阈值处理可以使用cv2.threshold()函数来完成。
retval, dst = cv2.threshold(src, thresh, maxval, type)
其中,参数解释如下:
src:输入图像,可以是灰度图像或彩色图像。thresh:设定的阈值。maxval:二值化后的最大值。当type为cv2.THRESH_BINARY或cv2.THRESH_BINARY_INV时,像素值大于阈值的部分会设置为maxval,否则会设置为0。type:二值化操作的类型,包括:cv2.THRESH_BINARY:二值化操作,大于阈值的像素值设置为maxval,小于等于阈值的像素值设置为0。cv2.THRESH_BINARY_INV:反向二值化操作,大于阈值的像素值设置为0,小于等于阈值的像素值设置为maxval。cv2.THRESH_TRUNC:截断操作,大于阈值的像素值设置为阈值,小于等于阈值的像素值保持不变。cv2.THRESH_TOZERO:像素值小于等于阈值的设置为0,大于阈值的保持不变。cv2.THRESH_TOZERO_INV:像素值大于等于阈值的设置为0,小于阈值的保持不变。
cv2.threshold()函数的返回值为一个元组,包括:
retval:实际使用的阈值。dst:二值化后的输出图像。
2 二值化处理
灰度图像
通过对灰度图像进行二值处理,可以在图形中只保留两种颜色,通常我们设定为255(白色)和0(黑色),但也可根据需求设置为黑色和灰色的二值图像,如:
import cv2
img = cv2.imread("lenacolor.png", 0) # 将图像读成灰度图像
t1, dst1 = cv2.threshold(img, 127, 255, cv2.THRESH_BINARY) # 二值化阈值处理
t2, dst2 = cv2.threshold(img, 127, 200, cv2.THRESH_BINARY)
cv2.imshow('img', img)
cv2.imshow('dst1', dst1)
cv2.imshow('dst2', dst2)
cv2.waitKey()
cv2.destroyAllWindows()

彩色图像
同样这一方法可用于彩色图像,通过对某一通道进行二值化,使图像的颜色变得更加夸张,如:
import cv2 img = cv2.imread('lenacolor.png')
b, g, r = cv2.split(img) # 将BGR通道分离 # 对红色通道进行阈值处理
t1, r = cv2.threshold(r, 127, 255, cv2.THRESH_BINARY) img_after = cv2.merge([b, g, r]) cv2.imshow('original', img)
cv2.imshow('threshold', img_after)
cv2.waitKey(0)
cv2.destroyAllWindows()

反二值化处理
反二值化处理(Inverse Thresholding)是二值化处理的一种变体,其作用是将灰度图像的像素值根据一个设定的阈值分成两部分,但是与普通二值化处理不同的是,反二值化处理将像素值大于阈值的部分设置为0,小于等于阈值的部分设置为最大像素值,即产生一个反色的二值化图像。代码中type需要设置为cv2.THRESH_BINARY_INV。
防止视觉疲劳,后面的图换了一下示例图像
3 零处理
低于阈值零处理
低于阈值的部分会被处理为0,此时填入的maxval无效
对灰度图来说,低于阈值的部分将会被处理为黑色;对于RGB彩图来说,低于阈值的部分图像会变暗。
import cv2
img1 = cv2.imread("test.png", 0) # 将图像读成灰度图像
img2 = cv2.imread("test.png") b, g, r = cv2.split(img2) # 将BGR通道分离 t1, dst1 = cv2.threshold(img1, 127, 255, cv2.THRESH_TOZERO) # 低于阈值零处理
cv2.imshow('img1', img1)
cv2.imshow('dst1', dst1) t2, b = cv2.threshold(b, 127, 255, cv2.THRESH_TOZERO) # 低于阈值零处理
img_after = cv2.merge([b, g, r])
cv2.imshow('img2', img2)
cv2.imshow('img_after', img_after) cv2.waitKey()
cv2.destroyAllWindows()

超出阈值零处理
类似反二值化处理。将超出某一阈值的部分进行归零处理。超出阈值零处理可以在一些特定的场合下使用,例如在一些需要保留一定程度的图像细节的场合,超出阈值零处理可以避免将过多的像素值直接设置为0或最大像素值,从而使图像保留更多的细节信息。
4 截断处理
该方法传入的type是cv2.THRESH_TRUNC,代码结构与前面高度重合,此处不再贴代码。
截断处理是二值化处理的一种变体,其作用是将灰度图像的像素值根据一个设定的阈值分成两部分,但是与普通的二值化处理不同的是,超出阈值的部分不会被设置为0或最大像素值,而是被截断为阈值本身。
图像截断处理通常适合用于需要保留图像主要信息的场合,而又不需要进行明显的二值化操作的场合。在这种情况下,截断处理可以使得图像保留更多的灰度级,从而能够更好地保留图像中的细节和信息,同时又能够去除一些噪声或者不需要的部分。
5 自适应处理
自适应阈值处理是图像处理中的一种常见操作,可以根据图像局部的灰度特征来自适应地确定阈值,以达到更好的二值化效果。在OpenCV中,可以使用cv2.adaptiveThreshold()函数进行自适应阈值处理。
相比于阈值处理,自适应处理具有以下优点:
- 自适应处理可以根据局部像素的灰度值特征来确定二值化阈值,从而适应图像的不同区域和不同光照条件,能够更好地突出图像中的目标物体。
- 自适应处理可以在处理过程中保留更多的细节信息,减少因阈值过大或过小而造成的信息丢失,提高图像处理的准确性。
- 自适应处理适用于复杂背景下的目标物体分割,特别是在背景区域灰度分布不均的情况下,能够更好地处理背景区域和目标区域的差异。
自适应处理相比于阈值处理具有更好的适应性和灵活性,可以在不同的图像处理场景中应用。当图像的灰度分布不均、光照条件不同或需要保留更多的细节信息时,自适应处理通常是更好的选择。
cv2.adaptiveThreshold()函数的基本语法如下:
dst = cv2.adaptiveThreshold(src, maxValue, adaptiveMethod, thresholdType, blockSize, C)
其中:
src:输入图像,必须为灰度图像。maxValue:二值化后的最大值。adaptiveMethod:自适应阈值处理的方法,包括:cv2.ADAPTIVE_THRESH_MEAN_C:基于均值的自适应阈值处理。cv2.ADAPTIVE_THRESH_GAUSSIAN_C:基于高斯加权平均值的自适应阈值处理。
thresholdType:阈值类型,与普通二值化处理相同,包括:cv2.THRESH_BINARY:二值化操作,大于阈值的像素值设置为maxValue,小于等于阈值的像素值设置为0。cv2.THRESH_BINARY_INV:反向二值化操作,大于阈值的像素值设置为0,小于等于阈值的像素值设置为maxValue。
blockSize:每个像素点周围用来计算阈值的像素数。必须是奇数。C:阈值校正值。该值会被加到均值或加权平均值上,用于调整阈值。
cv2.adaptiveThreshold()函数的返回值为二值化后的输出图像。
仍以上一张图像为例:
import cv2 image_Gray = cv2.imread("test.png", 0) # 自适应阈值的计算方法为cv2.ADAPTIVE_THRESH_MEAN_C
athdMEAM = cv2.adaptiveThreshold\ (image_Gray, 255, cv2.ADAPTIVE_THRESH_MEAN_C, cv2.THRESH_BINARY, 5, 0)
# 自适应阈值的计算方法为cv2.ADAPTIVE_THRESH_GAUSSIAN_C
athdGAUS = cv2.adaptiveThreshold\ (image_Gray, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C,cv2.THRESH_BINARY, 5, 0)
# 显示自适应阈值处理的结果
cv2.imshow("MEAN_C", athdMEAM)
cv2.imshow("GAUSSIAN_C", athdGAUS)
cv2.waitKey()
cv2.destroyAllWindows()

可以看出自适应阈值似乎保留了更多细节,但此处效果并不好,也就说明自适应并不能完全代替人工选择。(对于人脸图像,该方法的效果会比上图更好一些)
6 Ostu方法
Otsu’s method 是一种经典的自适应阈值处理算法,可以自动确定图像的二值化阈值。该算法可以将图像中的像素值分为两部分,从而将图像转换为二值图像。在 OpenCV 中,可以使用cv2.threshold()函数进行 Otsu’s method 处理。在type中,输入对应的方法名+cv2.THRESH_OTSU即可调用该方法。该方法的存在也是threshold将阈值作为返回值的意义所在。
在 Otsu’s method 中,不需要预先指定阈值,而是通过计算图像灰度直方图和类间方差来确定阈值。具体来说,该方法会计算每一个像素灰度值作为阈值时,将图像分为前景和背景两部分的类间方差,然后选取类间方差最大的像素灰度值作为二值化阈值。
import cv2img = cv2.imread('test.png', 0)
ret, thresh = cv2.threshold(img, 0, 255, cv2.THRESH_BINARY+cv2.THRESH_OTSU)cv2.imshow('original', img)
cv2.imshow('Otsu threshold', thresh)
cv2.waitKey(0)
cv2.destroyAllWindows()

相关文章:
06 OpenCV 阈值处理、自适应处理与ostu方法
1 基本概念 CV2中使用阈值的作用是将灰度图像二值化,即将灰度图像的像素值根据一个设定的阈值分成黑白两部分。阈值处理可以用于图像分割、去除噪声、增强图像对比度等多个领域。例如,在物体检测和跟踪中,可以通过对图像进行阈值处理来提取目…...
RFC7519规范-JWT - json web token
简介 什么是JWT(JSON Web Token) 在介绍JWT之前,我们先来回顾一下利用token进行用户身份验证的流程: 客户端使用用户名和密码请求登录服务端收到请求,验证用户名和密码验证成功后,服务端会签发一个token,再把这个to…...
移动机器人设计与实践课程大纲
MiR移动机器人参考资料:图一 西北工业大学-课程平台图二 清华大学出版社-移动机器人目前,基本都是双一流大学开设此类课程,并且都是至少3-4学分,16学时/学分,48-64学时。(⊙﹏⊙),难办了。咱这只有…...
Lesson 7.2 Mini Batch K-Means与DBSCAN密度聚类
文章目录一、Mini Batch K-Means 算法原理与实现二、DBSCAN 密度聚类基本原理与实践1. K-Means 聚类算法的算法特性2. DBSCAN 密度聚类基本原理3. DBSCAN 密度聚类的 sklearn 实现除了 K-Means 快速聚类意外,还有两种常用的聚类算法。(1) 是能…...
11.Dockerfile最佳实践
Dockerfile 最佳实践 Docker官方关于Dockerfile最佳实践原文链接地址:https://docs.docker.com/develop/develop-images/dockerfile_best-practices/ Docker 可以通过从 Dockerfile 包含所有命令的文本文件中读取指令自动构建镜像,以便构建给定镜像。 …...
【企业云端全栈开发实践-1】项目介绍及环境准备、Spring Boot快速上手
本节目录一、 项目内容介绍二、Maven介绍2.1 Maven作用2.2 Maven依赖2.3 本地仓库配置三、Spring Boot快速上手3.1 Spring Boot特点3.2 遇到的Bug:spring-boot-maven-plugin3.3 遇到的Bug2:找不到Getmapping四、开发环境热部署一、 项目内容介绍 本课程…...
5-HT2A靶向药物|适应症|市场销售-上市药品前景分析
据世界卫生组织称,抑郁症是一种多因素疾病,影响全球约3.5 亿人。中枢神经系统最广泛的单胺 - 血清素 (5-HT) 被认为在这种情况的病理机制中起着至关重要的作用,并且神经递质的重要性被“血清素假说”提升,将抑郁症的存在联系起来 …...
HTTPS协议原理---详解
目录 一、HTTPS 1.加密与解密 2.我们为什么要加密? 3.常见加密方式 ①对称加密 ②非对称加密 4.数据摘要 5.数字签名 二、HTTPS的加密方案 1.只是用对称加密 2.只使用非对称加密 3.双方都使用非对称加密 4.非对称加密+对称加密 中间人攻…...
Pytest学习笔记
Pytest学习笔记 1、介绍 1.1、单元测试 单元测试是指在软件开发当中,针对软件的最小单位(函数,方法)进行正确性的检查测试 1.2、单元测试框架 测试发现:从多个py文件里面去找到我们测试用例测试执行:按…...
Fuzz概述
文章目录AFL一些概念插桩与覆盖率边和块覆盖率afl自实现劫持汇编器clang内置覆盖率反馈与引导变异遗传算法fork server机制AFL调试准备AFL一些概念 插桩与覆盖率 边和块 首先,要明白边和块的定义 正方形的就是块,箭头表示边,边表示程序执行…...
区块链知识系列 - 系统学习EVM(四)-zkEVM
区块链知识系列 - 系统学习EVM(一) 区块链知识系列 - 系统学习EVM(二) 区块链知识系列 - 系统学习EVM(三) 今天我们来聊聊 zkEVM、EVM 兼容性 和 Rollup 是什么? 1. 什么是 Rollup rollup顾名思义,就是把一堆交易卷(rollup)起来…...
Leetcode.2341 数组能形成多少数对
题目链接 Leetcode.2341 数组能形成多少数对 Rating : 1185 题目描述 给你一个下标从 0 开始的整数数组 nums。在一步操作中,你可以执行以下步骤: 从 nums选出 两个 相等的 整数从 nums中移除这两个整数,形成一个 数对 请你在 nums上多次执…...
C++复习笔记10
1. list是可以在常数范围内在任意位置进行插入和删除的序列式容器,并且该容器可以前后双向迭代。 2. list的底层是双向链表结构,双向链表中每个元素存储在互不相关的独立节点中,在节点中通过指针指向其前一个元素和后一个元素。 3. list与for…...
leaflet 纯CSS的marker标记,不用图片来表示(072)
第072个 点击查看专栏目录 本示例的目的是介绍演示如何在vue+leaflet中使用纯CSS来打造marker的标记。这里用到的是L.divIcon来引用CSS来构造新icon,然后在marker的属性中引用。 这里必须要注意的是css需要是全局性质的,不能被scoped转义为其他随机的css。 直接复制下面的 v…...
Elasticsearch:使用 intervals query - 根据匹配项的顺序和接近度返回文档
Intervals query 根据匹配项的顺序和接近度返回文档。Intervals 查询使用匹配规则,由一小组定义构成。 然后将这些规则应用于指定字段中的术语。 这些定义产生跨越文本正文中的术语的最小间隔序列。 这些间隔可以通过父源进一步组合和过滤。 上述描述有点费解。我…...
无法决定博客主题的人必看!如何选择类型和推荐的 5 种选择
是否有人不能迈出第一步,因为博客的类型还没有决定?有些人在出发时应该行动,而不是思考,但让我们冷静下来,仔细想想。博客的难度因流派而异,这在很大程度上决定了随后的发展。因此,在选择博客流…...
数字化转型的成功模版,珠宝龙头曼卡龙做对了什么?
2月11日,曼卡龙(300945.SZ)发布2022年业绩快报,报告期内,公司实现营业收入16.11亿元,同比增长28.63%。来源:曼卡龙2022年度业绩快报曼卡龙能在2022年实现营收增长尤为不易。2022年受疫情影响&am…...
转换矩阵、平移矩阵、旋转矩阵关系以及python实现旋转矩阵、四元数、欧拉角之间转换
文章目录1. 转换矩阵、平移矩阵、旋转矩阵之间的关系2. 缩放变换、平移变换和旋转变换2. python实现旋转矩阵、四元数、欧拉角互相转化由于在平时总是或多或少的遇到平移旋转的问题,每次都是现查资料,然后查了忘,忘了继续查,这次弄…...
中国地图航线图(echarjs)
1、以上为效果图 需要jq、echarjs、china.json三个文件支持。以上 2、具体代码 DOM部分 <!-- 服务范围 GO--> <div class"m-maps"><div id"main" style"width:1400px;height: 800px; margin: 0 auto;"> </div> <!-…...
Python正则表达式中group与groups的用法详解
本文主要介绍了Python正则表达式中group与groups的用法详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧目录在Python中,正则表达式的group和groups方…...
业务系统对接大模型的基础方案:架构设计与关键步骤
业务系统对接大模型:架构设计与关键步骤 在当今数字化转型的浪潮中,大语言模型(LLM)已成为企业提升业务效率和创新能力的关键技术之一。将大模型集成到业务系统中,不仅可以优化用户体验,还能为业务决策提供…...
springboot 百货中心供应链管理系统小程序
一、前言 随着我国经济迅速发展,人们对手机的需求越来越大,各种手机软件也都在被广泛应用,但是对于手机进行数据信息管理,对于手机的各种软件也是备受用户的喜爱,百货中心供应链管理系统被用户普遍使用,为方…...
React hook之useRef
React useRef 详解 useRef 是 React 提供的一个 Hook,用于在函数组件中创建可变的引用对象。它在 React 开发中有多种重要用途,下面我将全面详细地介绍它的特性和用法。 基本概念 1. 创建 ref const refContainer useRef(initialValue);initialValu…...
SciencePlots——绘制论文中的图片
文章目录 安装一、风格二、1 资源 安装 # 安装最新版 pip install githttps://github.com/garrettj403/SciencePlots.git# 安装稳定版 pip install SciencePlots一、风格 简单好用的深度学习论文绘图专用工具包–Science Plot 二、 1 资源 论文绘图神器来了:一行…...
Spring Boot 实现流式响应(兼容 2.7.x)
在实际开发中,我们可能会遇到一些流式数据处理的场景,比如接收来自上游接口的 Server-Sent Events(SSE) 或 流式 JSON 内容,并将其原样中转给前端页面或客户端。这种情况下,传统的 RestTemplate 缓存机制会…...
3-11单元格区域边界定位(End属性)学习笔记
返回一个Range 对象,只读。该对象代表包含源区域的区域上端下端左端右端的最后一个单元格。等同于按键 End 向上键(End(xlUp))、End向下键(End(xlDown))、End向左键(End(xlToLeft)End向右键(End(xlToRight)) 注意:它移动的位置必须是相连的有内容的单元格…...
xmind转换为markdown
文章目录 解锁思维导图新姿势:将XMind转为结构化Markdown 一、认识Xmind结构二、核心转换流程详解1.解压XMind文件(ZIP处理)2.解析JSON数据结构3:递归转换树形结构4:Markdown层级生成逻辑 三、完整代码 解锁思维导图新…...
结构化文件管理实战:实现目录自动创建与归类
手动操作容易因疲劳或疏忽导致命名错误、路径混乱等问题,进而引发后续程序异常。使用工具进行标准化操作,能有效降低出错概率。 需要快速整理大量文件的技术用户而言,这款工具提供了一种轻便高效的解决方案。程序体积仅有 156KB,…...
深度解析云存储:概念、架构与应用实践
在数据爆炸式增长的时代,传统本地存储因容量限制、管理复杂等问题,已难以满足企业和个人的需求。云存储凭借灵活扩展、便捷访问等特性,成为数据存储领域的主流解决方案。从个人照片备份到企业核心数据管理,云存储正重塑数据存储与…...
ZYNQ学习记录FPGA(二)Verilog语言
一、Verilog简介 1.1 HDL(Hardware Description language) 在解释HDL之前,先来了解一下数字系统设计的流程:逻辑设计 -> 电路实现 -> 系统验证。 逻辑设计又称前端,在这个过程中就需要用到HDL,正文…...
