opencv之阈值处理
文章目录
- 1. 阈值处理
- 2. 阈值处理的基本原理
- 3. 常见的阈值处理方法
- 3.1 全局阈值(Global Thresholding):
- 3.2 自适应阈值(Adaptive Thresholding):
- 3.2.1 工作原理
- 3.2.2 工作步骤
- 3.2.3 适用场景
- 3.2.4 优缺点
- 自适应阈值的优点
- 自适应阈值的缺点
- 3.3 Otsu’s 方法:
- 什么是最大化类间方差
- 工作原理
- 适用场景
- 优缺点
- 4. 应用场景
- 总结
1. 阈值处理
在图像处理领域,阈值处理(Thresholding)是一种简单而有效的技术,用于将灰度图像转化为二值图像(即每个像素点要么是黑色,要么是白色)。这种处理方式常用于分割图像中的前景和背景,或者提取特定的形状或物体。
2. 阈值处理的基本原理
阈值处理的基本思想是设定一个阈值 T T T,然后遍历图像中的每一个像素。如果像素的灰度值高于阈值,就将其设为白色(通常为255);如果低于阈值,则将其设为黑色(通常为0)。公式如下:
g ( x , y ) = { 255 , i f f ( x , y ) > T 0 , i f f ( x , y ) ≤ T (1) g(x,y)= \begin{cases} 255,if\quad f(x,y)>T\\ 0, if\quad f(x,y)\leq T \end{cases} \tag{1} g(x,y)={255,iff(x,y)>T0,iff(x,y)≤T(1)
其中, f ( x , y ) f(x,y) f(x,y) 是原始图像的灰度值, g ( x , y ) g(x,y) g(x,y) 是处理后的二值图像。
3. 常见的阈值处理方法
3.1 全局阈值(Global Thresholding):
- 在这种方法中,整个图像使用同一个阈值。适合于图像对比度较高且背景简单的情况。OpenCV 中常用的函数是
cv2.threshold。
import cv2# 读取灰度图像
image = cv2.imread('image.jpg', cv2.IMREAD_GRAYSCALE)# 全局阈值处理
_, thresh_global = cv2.threshold(image, 127, 255, cv2.THRESH_BINARY)# 显示结果
cv2.imshow('Global Thresholding', thresh_global)
cv2.waitKey(0)
cv2.destroyAllWindows()
3.2 自适应阈值(Adaptive Thresholding):
自适应阈值方法会根据图像的局部区域动态计算阈值,因此对于光照不均或对比度较低的图像更有效。自适应阈值根据局部窗口内的像素值计算每个像素的阈值,从而避免了全局阈值对整个图像的统一处理。
3.2.1 工作原理
自适应阈值(Adaptive Thresholding)的工作原理是根据图像局部区域的特征来动态调整阈值,从而处理光照不均或对比度不够的图像。它的主要思想是对于图像中的每一个像素,根据其周围邻域的像素值来确定一个局部阈值。这样可以避免全局阈值方法可能带来的效果不佳的问题,尤其是在图像的不同区域光照差异较大的情况下。
- 计算临近区域的加权平均值:
对于图像中的每一个像素点,自适应阈值方法会考虑该像素点周围的一定范围内的像素值。这些像素值形成了一个局部区域或窗口。
通过计算这个局部区域内的像素值的加权平均(或均值),得到一个阈值。加权平均意味着某些像素对计算结果的影响比其他像素更大,通常是窗口中心的像素权重更高。
- 获得阈值:
计算出的加权平均值(或均值)被用作该像素点的局部阈值。这个阈值代表了该像素所在局部区域的“亮度”水平。
- 对当前像素点进行处理:
使用计算得到的局部阈值来决定该像素点的类别。具体地说:
如果当前像素的值大于或等于局部阈值,则将其分类为前景(通常设为 255,白色)。
如果当前像素的值小于局部阈值,则将其分类为背景(通常设为 0,黑色)。
3.2.2 工作步骤
1. 局部邻域计算:
- 将图像划分为多个小的局部区域(通常称为窗口或块),在每个局部区域内计算一个局部阈值。这个局部阈值基于该区域内的像素值来动态确定。
2. 局部阈值计算:
对于每个局部区域,计算其局部阈值的常用方法包括均值和高斯加权平均:
-
均值自适应阈值(Adaptive Mean Thresholding): 阈值等于邻域像素的平均值减去一个常量。公式如下:
-
公式: T ( x , y ) = m e a n ( I ( x , y ) ) − C T(x,y)=mean(I(x,y))−C T(x,y)=mean(I(x,y))−C
-
其中:
- T ( x , y ) T(x,y) T(x,y)是位置 ( x , y ) (x,y) (x,y) 的阈值。
- m e a n ( I ( x , y ) ) mean(I(x,y)) mean(I(x,y)) 是位置 ( x , y ) (x,y) (x,y) 的邻域内像素的平均值。
- C C C 是一个常数,用于调整阈值。
-
在这种方法中,阈值是由邻域内像素的均值减去一个常数 C C C计算得到的。常数 C C C用于避免噪声对分割结果的影响。
-
高斯自适应阈值(Adaptive Gaussian Thresholding): 阈值等于邻域像素的加权平均值(权重为高斯窗口)减去一个常量。公式如下:
- T ( x , y ) = m e a n ( I ( x , y ) ) − C ⋅ s t d ( I ( x , y ) ) T(x,y)=mean(I(x,y))−C⋅std(I(x,y)) T(x,y)=mean(I(x,y))−C⋅std(I(x,y))
- 其中:
- T ( x , y ) T(x,y) T(x,y) 是位置 ( x , y ) (x,y) (x,y) 的阈值。
- m e a n ( I ( x , y ) ) mean(I(x,y)) mean(I(x,y)) 是位置 ( x , y ) (x,y) (x,y)的邻域内像素的平均值。
- s t d ( I ( x , y ) ) std(I(x,y)) std(I(x,y)) 是位置 ( x , y ) (x,y) (x,y)的邻域内像素的标准差。
- C C C是一个常数,用于调整阈值。
在这种方法中,阈值是由邻域内像素的均值减去标准差的 C C C倍计算得到的。这样可以更好地处理局部的光照变化和噪声。
3.二值化处理:
- 对于每个像素点,将其灰度值与计算得到的局部阈值进行比较。如果灰度值大于局部阈值,则将其设置为白色;否则,设置为黑色。
3.2.3 适用场景
- 图像光照不均匀或有明显的阴影。
- 需要在复杂背景下进行分割。
3.2.4 优缺点
自适应阈值的优点
- 适应光照变化: 能够处理光照不均匀的图像,避免全局阈值方法对不同区域处理不一致的问题。
- 局部处理: 通过局部窗口计算阈值,可以更好地处理细节和复杂背景。
自适应阈值的缺点
- 计算复杂度较高: 由于需要对每个像素计算局部阈值,处理时间相对较长。
- 参数选择: 自适应阈值方法中的参数(如窗口大小和常量)需要根据具体图像调整,以获得最佳效果。
import cv2# 读取灰度图像
image = cv2.imread('image.jpg', cv2.IMREAD_GRAYSCALE)# 自适应均值阈值处理
thresh_mean = cv2.adaptiveThreshold(image, 255, cv2.ADAPTIVE_THRESH_MEAN_C,cv2.THRESH_BINARY, 11, 2)# 自适应高斯阈值处理
thresh_gaussian = cv2.adaptiveThreshold(image, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C,cv2.THRESH_BINARY, 11, 2)# 显示结果
cv2.imshow('Adaptive Mean Thresholding', thresh_mean)
cv2.imshow('Adaptive Gaussian Thresholding', thresh_gaussian)
cv2.waitKey(0)
cv2.destroyAllWindows()
自定义实现(不使用 OpenCV)
如果你需要从头开始实现自适应阈值处理,以下是一个简化的 Python 代码示例:
import numpy as np
import cv2def adaptive_threshold(image, block_size, C):rows, cols = image.shapepadded_image = np.pad(image, pad_width=block_size//2, mode='constant', constant_values=0)result = np.zeros_like(image)for i in range(rows):for j in range(cols):block = padded_image[i:i+block_size, j:j+block_size]mean = np.mean(block)threshold = mean - Cresult[i, j] = 255 if image[i, j] >= threshold else 0return result# 读取图像(以灰度模式)
image = cv2.imread('input_image.png', cv2.IMREAD_GRAYSCALE)# 设置自适应阈值参数
block_size = 11
constant = 2# 计算自适应阈值
adaptive_thresh = adaptive_threshold(image, block_size, constant)# 显示结果
cv2.imshow('Original Image', image)
cv2.imshow('Adaptive Threshold', adaptive_thresh)# 等待按键并销毁窗口
cv2.waitKey(0)
cv2.destroyAllWindows()# 保存处理后的图像(可选)
cv2.imwrite('adaptive_thresh_custom.png', adaptive_thresh)
3.3 Otsu’s 方法:
Otsu’s 阈值法是一种自动选择阈值的全局方法。它通过分析图像的灰度直方图,找到能够最大化类间方差(前景和背景)的阈值。Otsu’s 方法适用于双峰分布的图像(即前景和背景的灰度值分布相对独立且存在两个峰值)。
什么是最大化类间方差
最大化类间方差(Between-Class Variance)是 Otsu’s 阈值法的核心概念,旨在选择一个最佳阈值,使得图像的前景和背景之间的差异最大化。这种方法通过分析图像的灰度直方图,找到一个阈值,使得图像被分割成前景和背景后,它们之间的类间方差最大。
工作原理
Otsu’s 方法遍历所有可能的阈值,并计算每个阈值对应的类间方差,选择使类间方差最大的阈值作为最终的阈值。
适用场景
- 图像的灰度直方图呈现双峰分布。
- 需要自动选择最优阈值。
优缺点
- 优点: 自动选择阈值,适用于双峰图像的分割。
- 缺点: 对多峰分布的图像效果不佳,计算量相对较大。
公式推导链接:https://blog.csdn.net/leonardohaig/article/details/120269341
OpenCV 中可以通过设置 cv2.THRESH_OTSU 来使用。
import cv2# 读取灰度图像
image = cv2.imread('image.jpg', cv2.IMREAD_GRAYSCALE)# Otsu's 阈值处理
_, thresh_otsu = cv2.threshold(image, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)# 显示结果
cv2.imshow('Otsu Thresholding', thresh_otsu)
cv2.waitKey(0)
cv2.destroyAllWindows()
代码
import cv2
import numpy as np# 读取图像并转换为灰度图像
image = cv2.imread('image.jpg', cv2.IMREAD_GRAYSCALE)# 全局阈值处理
_, thresh_global = cv2.threshold(image, 127, 255, cv2.THRESH_BINARY)# 自适应阈值处理
thresh_adaptive = cv2.adaptiveThreshold(image, 255, cv2.ADAPTIVE_THRESH_MEAN_C,cv2.THRESH_BINARY, 11, 2)# Otsu's 阈值处理
_, thresh_otsu = cv2.threshold(image, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)# 显示结果
cv2.imshow('Global Thresholding', thresh_global)
cv2.imshow('Adaptive Thresholding', thresh_adaptive)
cv2.imshow('Otsu Thresholding', thresh_otsu)
cv2.waitKey(0)
cv2.destroyAllWindows()
4. 应用场景
- 文档图像的二值化:用于将扫描的文档图像转换为黑白图像,以便进一步的 OCR(光学字符识别)处理。
- 物体检测:在自动化检测系统中,阈值处理可以用于分割目标物体,以便进行形状分析或特征提取。
- 医学图像处理:用于分割细胞、器官或其他生物结构。
阈值处理是图像预处理中常用的步骤,尤其适合对噪声较少、对比度较高的图像进行处理。根据具体应用的需要,可以选择合适的阈值处理方法。
总结
- 全局阈值适合简单、光照均匀的图像,计算速度快但对复杂场景效果不好。
- 自适应阈值适合光照不均的复杂图像,能更好地处理细节,但计算复杂度较高。
- Otsu’s 阈值法是一种自动选择阈值的全局方法,适合灰度直方图呈双峰分布的图像。
相关文章:
opencv之阈值处理
文章目录 1. 阈值处理2. 阈值处理的基本原理3. 常见的阈值处理方法3.1 全局阈值(Global Thresholding):3.2 自适应阈值(Adaptive Thresholding):3.2.1 工作原理3.2.2 工作步骤3.2.3 适用场景3.2.4 优缺点自适应阈值的优点自适应阈…...
oracle startup失败,ORA-01078: failure in processing system parameters
SQL> startup ORA-01078: failure in processing system parameters LRM-00109: could not open parameter file /data/oracle/product/11.2.0/db_1/dbs/initorc1.ora 出错的原因可能是:文件名字不正确,文件权限不对,文件不存在&#x…...
【python因果推断库7】使用 pymc 模型的工具变量建模 (IV)2
目录 与普通最小二乘法 (OLS) 的比较 应用理论:政治制度与GDP 拟合模型:贝叶斯方法 多变量结果和相关性度量 结论 与普通最小二乘法 (OLS) 的比较 simple_ols_reg sk_lin_reg().fit(X.reshape(-1, 1), y)print("Intercept:", simple_ols_…...
【2024数模国赛赛题思路公开】国赛B题思路丨附可运行代码丨无偿自提
2024年国赛B题解题思路 问题 1: 抽样检测方案设计 【题目分析】 分析: 目标是设计一个高效的抽样检测方案,在尽量少的样本数量下,确保在高信度水平下做出正确的接受或拒收决策。需要处理两个不同的信度要求,这对样本量的计算提…...
智能优化特征选择|基于鲸鱼WOA优化算法实现的特征选择研究Matlab程序(KNN分类器)
智能优化特征选择|基于鲸鱼WOA优化算法实现的特征选择研究Matlab程序(KNN分类器) 文章目录 一、基本原理原理流程举个例子总结 二、实验结果三、核心代码四、代码获取五、总结 智能优化特征选择|基于鲸鱼WOA优化算法实现的特征选择研究Matlab程序&#x…...
使用udp进行通信
UDP chat 头文件 #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <string.h> #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> #include <time…...
C#上位机使用Microsoft.Office.Interop.Excel和EPPlus库对Excel或WPS表格进行写操作
C#上位机使用Microsoft.Office.Interop.Excel和EPPlus库对Excel或WPS表格进行写操作 一、使用Microsoft.Office.Interop.Excel库 1、通过NuGet包管理器添加引用 按照下图中红框所示进行操作。 需要安装Microsoft.Office.Interop.Excel包 添加Microsoft Office 16.0 Object …...
java重点学习-redis
一.redis 穿透无中生有key,布隆过滤nul隔离 锁与非期解难题。缓存击穿过期key, 雪崩大量过期key,过期时间要随机。 面试必考三兄弟,可用限流来保底。 1.1 Redis的使用场景 根据自己简历上的业务进行回答 缓存穿透、击穿、雪崩、双…...
每日刷题(图论)
P1119 灾后重建 P1119 灾后重建 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 思路 看数据范围知道需要用到Floyd算法,但是道路是不能直接用的,需要等到连接道路的两个村庄重建好才可以使用,所以这需要按照时间依次加入中转点,…...
Requestium - 将Requests和Selenium合并在一起的自动化测试工具
Requests 是 Python 的第三方库,主要用于发送 http 请求,常用于接口自动化测试等。 Selenium 是一个用于 Web 应用程序的自动化测试工具。Selenium 测试直接运行在浏览器中,就像真正的用户在操作一样。 本篇介绍一款将 Requests 和 Seleniu…...
mysql和pg等数据库之间的数据迁移实战分享
mysql和pg等数据库之间的数据迁移是常见的问题:比如一开始使用Oracle,后来想使用mysql,而且需要把Oracle数据库的数据迁移到mysql里面;后期有想使用pg数据库,同时需要把Mysql数据库的数据迁移到pgl里面,等等…...
消息中间件都有哪些
RabbitMQ:这可是一个开源的消息代理软件,也叫消息中间件。它支持多种消息传递协议,可以轻松地在分布式系统中进行可靠的消息传递。 Kafka:Apache Kafka是一个分布式流处理平台,它主要用于处理实时数据流。Kafka的设计初…...
数据结构(3)内核链表
一、内核链表 内核链表是一种在操作系统内核中使用的数据结构,主要用于管理和组织内核对象。它是有头双向链表的一种实现。 内核链表的特点 双向链表: 内核链表的每个节点都包含指向前一个节点和后一个节点的指针,这使得在链表中进行插入和删除操作时更…...
Linux 硬件学习 s3c2440 arm920t蜂鸣器
1.查找手册时钟图,输入12m想要通过pll得到400m的信号 2.对比pll值,找到最近的为405,得到pll中mdiv为127,pdiv为2,sdiv为1 3.想要得到fclk400,hclk100,pclk50,对比分频比例࿰…...
提交保存,要做重复请求拦截,避免出现重复保存的问题
**问题:**前端ajax提交数据的时候,当频繁点击的时候,或者两个账号以相同数据创建的时候,会出现问题。 **处理办法:**前端拦截,防止重复提交数据,在上一次请求返回结果之后才允许提交第二次&…...
华为 HCIP-Datacom H12-821 题库 (3)
有需要题库的可以看主页置顶 1.运行 OSPF 协议的路由器在交互 DD 报文时,会使用以下哪一个参数选举主从关系? A、接口的 IP 地址 B、接口的 DR 优先级 C、Area ID D、Router ID 答案:D 解析: Router-ID 大的为主&a…...
spring-boot 事件
事件触发时机常用监听器描述ApplicationStartingEvent应用启动时LoggingApplicationListener:决定加载哪个日志系统ApplicationEnvironmentPreparedEvent创建Environment之后BootstrapApplicationListener:加载spring-cloud bootstrap配置文件࿱…...
合碳智能 × Milvus:探索化学合成新境界——逆合成路线设计
合碳智能(C12.ai)成立于2022年,致力于运用AI和具身智能技术,为药物研发实验室提供新一代智能化解决方案,推动实验室从自动化迈向智能化,突破传统实验模式与人员的依赖,解决效率和成本的瓶颈&…...
二分查找 | 二分模板 | 二分题目解析
1.二分查找 二分查找的一个前提就是要保证数组是有序的(不准确)!利用二段性! 1.朴素二分模板 朴素二分法的查找中间的值和目标值比较 while(left < right) // 注意是要: < {int mid left (right -left) / 2;…...
uni-app应用更新(Android端)
关于app更新,uni-app官方推荐的是 uni-upgrade-center,看了下比较繁琐,因此这里自己实现检查更新并下载安装的逻辑。 1.界面效果 界面中的弹框和 进度条采用了uView 提供的组件 2.检查更新并下载安装 一、版本信息配置在服务端,…...
论文解读:交大港大上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(二)
HoST框架核心实现方法详解 - 论文深度解读(第二部分) 《Learning Humanoid Standing-up Control across Diverse Postures》 系列文章: 论文深度解读 + 算法与代码分析(二) 作者机构: 上海AI Lab, 上海交通大学, 香港大学, 浙江大学, 香港中文大学 论文主题: 人形机器人…...
CTF show Web 红包题第六弹
提示 1.不是SQL注入 2.需要找关键源码 思路 进入页面发现是一个登录框,很难让人不联想到SQL注入,但提示都说了不是SQL注入,所以就不往这方面想了 先查看一下网页源码,发现一段JavaScript代码,有一个关键类ctfs…...
css实现圆环展示百分比,根据值动态展示所占比例
代码如下 <view class""><view class"circle-chart"><view v-if"!!num" class"pie-item" :style"{background: conic-gradient(var(--one-color) 0%,#E9E6F1 ${num}%),}"></view><view v-else …...
可靠性+灵活性:电力载波技术在楼宇自控中的核心价值
可靠性灵活性:电力载波技术在楼宇自控中的核心价值 在智能楼宇的自动化控制中,电力载波技术(PLC)凭借其独特的优势,正成为构建高效、稳定、灵活系统的核心解决方案。它利用现有电力线路传输数据,无需额外布…...
大数据零基础学习day1之环境准备和大数据初步理解
学习大数据会使用到多台Linux服务器。 一、环境准备 1、VMware 基于VMware构建Linux虚拟机 是大数据从业者或者IT从业者的必备技能之一也是成本低廉的方案 所以VMware虚拟机方案是必须要学习的。 (1)设置网关 打开VMware虚拟机,点击编辑…...
蓝牙 BLE 扫描面试题大全(2):进阶面试题与实战演练
前文覆盖了 BLE 扫描的基础概念与经典问题蓝牙 BLE 扫描面试题大全(1):从基础到实战的深度解析-CSDN博客,但实际面试中,企业更关注候选人对复杂场景的应对能力(如多设备并发扫描、低功耗与高发现率的平衡)和前沿技术的…...
服务器硬防的应用场景都有哪些?
服务器硬防是指一种通过硬件设备层面的安全措施来防御服务器系统受到网络攻击的方式,避免服务器受到各种恶意攻击和网络威胁,那么,服务器硬防通常都会应用在哪些场景当中呢? 硬防服务器中一般会配备入侵检测系统和预防系统&#x…...
python如何将word的doc另存为docx
将 DOCX 文件另存为 DOCX 格式(Python 实现) 在 Python 中,你可以使用 python-docx 库来操作 Word 文档。不过需要注意的是,.doc 是旧的 Word 格式,而 .docx 是新的基于 XML 的格式。python-docx 只能处理 .docx 格式…...
C++八股 —— 单例模式
文章目录 1. 基本概念2. 设计要点3. 实现方式4. 详解懒汉模式 1. 基本概念 线程安全(Thread Safety) 线程安全是指在多线程环境下,某个函数、类或代码片段能够被多个线程同时调用时,仍能保证数据的一致性和逻辑的正确性…...
Element Plus 表单(el-form)中关于正整数输入的校验规则
目录 1 单个正整数输入1.1 模板1.2 校验规则 2 两个正整数输入(联动)2.1 模板2.2 校验规则2.3 CSS 1 单个正整数输入 1.1 模板 <el-formref"formRef":model"formData":rules"formRules"label-width"150px"…...
