OpenCV阈值处理完全指南:从基础到高级应用

news2025/5/21 2:16:22

引言

阈值处理是图像处理中最基础、最常用的技术之一,它能够将灰度图像转换为二值图像,为后续的图像分析和处理奠定基础。本文将全面介绍OpenCV中的各种阈值处理方法,包括原理讲解、代码实现和实际应用场景。

一、什么是阈值处理?

阈值处理(Thresholding)是通过设定一个或多个阈值,将图像的像素值分为若干类的过程。对于灰度图像,通常是选择一个阈值,将像素分为"黑"和"白"两类,从而创建二值图像。

数学表达式:

dst(x,y) = maxVal if src(x,y) > thresh
         = 0      otherwise

二、OpenCV中的阈值处理函数

OpenCV提供了cv2.threshold()函数用于基本的阈值处理,其函数原型为:

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

参数说明:

  • src:输入图像(必须为灰度图)
  • thresh:阈值
  • maxval:当像素值超过阈值时赋予的最大值
  • type:阈值类型
  • retval:实际使用的阈值(某些方法会自动计算)
  • dst:输出图像

三、5种基本阈值处理方法

1. 二进制阈值化(THRESH_BINARY)

import cv2
import numpy as np

img = cv2.imread('image.jpg', 0)  # 以灰度模式读取
ret, thresh1 = cv2.threshold(img, 127, 255, cv2.THRESH_BINARY)

效果:像素值>127设为255,否则设为0

2. 反二进制阈值化(THRESH_BINARY_INV)

ret, thresh2 = cv2.threshold(img, 127, 255, cv2.THRESH_BINARY_INV)

效果:与THRESH_BINARY相反

3. 截断阈值化(THRESH_TRUNC)

ret, thresh3 = cv2.threshold(img, 127, 255, cv2.THRESH_TRUNC)

效果:像素值>127设为127,否则保持不变

4. 阈值化为0(THRESH_TOZERO)

ret, thresh4 = cv2.threshold(img, 127, 255, cv2.THRESH_TOZERO)

效果:像素值>127保持不变,否则设为0

5. 反阈值化为0(THRESH_TOZERO_INV)

ret, thresh5 = cv2.threshold(img, 127, 255, cv2.THRESH_TOZERO_INV)

效果:与THRESH_TOZERO相反

四、自适应阈值处理

当图像光照不均时,全局阈值效果不佳,此时可以使用自适应阈值:

thresh = cv2.adaptiveThreshold(img, 255, cv2.ADAPTIVE_THRESH_MEAN_C,
                              cv2.THRESH_BINARY, 11, 2)

参数说明:

  • adaptiveMethod:自适应方法
    • ADAPTIVE_THRESH_MEAN_C:邻域均值
    • ADAPTIVE_THRESH_GAUSSIAN_C:邻域加权和(高斯)
  • blockSize:邻域大小(奇数)
  • C:从均值或加权和中减去的常数

五、Otsu’s二值化(大津算法)

对于双峰图像(直方图有两个明显峰值),Otsu方法可以自动确定最佳阈值:

ret2, th2 = cv2.threshold(img, 0, 255, cv2.THRESH_BINARY+cv2.THRESH_OTSU)

六、实际应用案例

1. 文档扫描与OCR预处理

def preprocess_for_ocr(image_path):
    img = cv2.imread(image_path, 0)
    # 使用Otsu方法自动阈值化
    _, thresh = cv2.threshold(img, 0, 255, cv2.THRESH_BINARY_INV + cv2.THRESH_OTSU)
    # 去噪
    kernel = np.ones((3,3), np.uint8)
    processed = cv2.morphologyEx(thresh, cv2.MORPH_OPEN, kernel, iterations=1)
    return processed

2. 工业检测中的缺陷识别

def detect_defects(reference_img, test_img):
    # 转换为灰度图
    ref_gray = cv2.cvtColor(reference_img, cv2.COLOR_BGR2GRAY)
    test_gray = cv2.cvtColor(test_img, cv2.COLOR_BGR2GRAY)
    
    # 计算差异
    diff = cv2.absdiff(ref_gray, test_gray)
    
    # 自适应阈值处理
    thresh = cv2.adaptiveThreshold(diff, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C,
                                  cv2.THRESH_BINARY, 11, 2)
    
    # 寻找轮廓
    contours, _ = cv2.findContours(thresh, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
    
    # 绘制缺陷区域
    result = test_img.copy()
    for cnt in contours:
        if cv2.contourArea(cnt) > 10:  # 忽略小面积
            x,y,w,h = cv2.boundingRect(cnt)
            cv2.rectangle(result, (x,y), (x+w,y+h), (0,0,255), 2)
    
    return result

七、阈值处理的高级技巧

1. 多阈值处理

def multi_threshold(image):
    gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
    
    # 定义三个阈值
    _, th1 = cv2.threshold(gray, 50, 255, cv2.THRESH_BINARY)
    _, th2 = cv2.threshold(gray, 100, 255, cv2.THRESH_BINARY)
    _, th3 = cv2.threshold(gray, 150, 255, cv2.THRESH_BINARY)
    
    # 组合结果
    result = np.zeros_like(gray)
    result[(gray >= 0) & (gray < 50)] = 0
    result[(gray >= 50) & (gray < 100)] = 100
    result[(gray >= 100) & (gray < 150)] = 200
    result[gray >= 150] = 255
    
    return result

2. 基于HSV空间的阈值处理

def hsv_threshold(image):
    hsv = cv2.cvtColor(image, cv2.COLOR_BGR2HSV)
    
    # 定义颜色范围(示例:红色)
    lower_red = np.array([0, 120, 70])
    upper_red = np.array([10, 255, 255])
    mask1 = cv2.inRange(hsv, lower_red, upper_red)
    
    lower_red = np.array([170, 120, 70])
    upper_red = np.array([180, 255, 255])
    mask2 = cv2.inRange(hsv, lower_red, upper_red)
    
    # 合并mask
    mask = mask1 + mask2
    
    # 应用mask
    result = cv2.bitwise_and(image, image, mask=mask)
    
    return result

八、性能优化

性能优化建议:

  1. 对小图像使用全局阈值,对大图像使用自适应阈值
  2. 在循环中处理视频帧时,预先转换为灰度图
  3. 合理选择blockSize(通常11-31之间的奇数)

九、总结

阈值处理是图像分割和特征提取的基础,掌握各种阈值处理方法能够为更复杂的计算机视觉任务打下坚实基础。本文介绍了OpenCV中的基本阈值处理方法、自适应阈值和大津算法,并提供了实际应用案例和高级技巧。希望通过本文的学习,您能够根据不同的应用场景选择合适的阈值处理方法。

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

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

相关文章

【AWS入门】Amazon SageMaker简介

【AWS入门】Amazon SageMaker简介 [AWS Essentials] Brief Introduction to Amazon SageMaker By JacksonML 机器学习(Machine Learning&#xff0c;简称ML) 是当代流行的计算机科学分支技术。通常&#xff0c;人们在本地部署搭建环境&#xff0c;以满足机器学习的要求。 AWS…

MYSQL 故障排查与生产环境优化

目录 一.前置知识点 1. 案例需求 &#xff08;1&#xff09;mysql 常见故障解决 &#xff08;2&#xff09;mysql 性能优化 2.案例实施思路 &#xff08;1&#xff09;单库常见故障分析 &#xff08;2&#xff09;主从常见故障分析 &#xff08;3&#xff09;从几个不同…

解决使用@JsonFormat(pattern = “yyyy-MM-dd HH:mm:ss“, timezone = “GMT+8“)时区转换无效的问题

前言 对于一些时间的字段&#xff0c;我们从数据库查询出来通常需要转换后返回给前端展示&#xff0c;前端需要的格式一般为yyyy-MM-dd HH:mm:ss&#xff0c;可以通过JsonFormat注解来作转换和时区转换。 问题场景 原因 LocalDateTime类本身不带时区信息所以转换无效 解决办…

计算机网络概要

⽹络相关基础知识 协议 两设备之间使⽤光电信号传输信息数据 要想传递不同信息 那么⼆者ᳵ就需要约定好的数据格式 层 封装 继承 多态是计算机的性质 它们⽀持了软硬件分层的实现 同层协议可以ᳵ接通信 同层协议ᳵ不直接通信 是各⾃调⽤下层提供的结构能⼒完成通信 分层…

Word压缩解决方案

Word压缩解决方案&#xff1a;基于图片压缩的 .docx 优化实践 &#x1f4cc; 背景 在日常科研写作或项目文档整理中&#xff0c;Word 文档&#xff08;.docx&#xff09;往往因为插入大量高清图表、扫描图像、公式图等导致文件体积过大&#xff0c;或者毕业学位论文查重要求上…

TDengine 2025年产品路线图

TDengine OSS 之 2025 年年度路线图如下表所示。 季度功能2025Q1 虚拟表查询能力&#xff1a;REGEXP、GREATEST、LEAST、CAST 函数支持判断表达式、单行选择函数的其他列值、INTERP 支持插值时间范围存储能力&#xff1a;支持将查询结果写入超级表、超级表支持 KEEP 参数、STM…

Ubuntu服务器部署多语言项目(Node.js/Python)方式实践

Ubuntu服务器部署多语言项目&#xff08;Node.js/Python&#xff09;方式实践 服务器脚本运行方式命令行直接执行nohup后台执行进程 Screen概述安装基本操作命令启动 Screen退出当前会话&#xff08;不终止进程&#xff09;查看所有会话重连会话关闭会话 常用快捷键典型使用场景…

计算机网络 - 2.基础协议

1.TCP协议 1.TCP(Transmission Control Protocol):传输控制协议2.TCP协议是一种面向连接的、可靠的、 基于字节流的传输层通信协议 1.面向连接:两个使用TCP协议的应用(通常一个客户和一个服务器)在彼此交换数据包之前必须先建立一个TCP连接2.可靠的 1.数据传输之前都要建立…

初识css,css语法怎样学好css以及常见问题与避坑

一、CSS 是什么&#xff1f; CSS&#xff08;Cascading Style Sheets&#xff09;是一种用于描述网页文档&#xff08;HTML 或 XML&#xff09;呈现样式的语言。它负责控制网页元素的视觉表现&#xff0c;如颜色、字体、布局等&#xff0c;使内容与展示分离。 二、CSS 语法结构…

Axure疑难杂症:垂直菜单展开与收回(4大核心问题与专家级解决方案)

亲爱的小伙伴,在您浏览之前,烦请关注一下,在此深表感谢!如有帮助请订阅专栏! Axure产品经理精品视频课已登录CSDN可点击学习https://edu.csdn.net/course/detail/40420 课程主题:垂直菜单展开与收回 主要内容:超长菜单实现、展开与收回bug解释、Axure9版本限制等问题解…

vue2.0 组件生命周期

个人简介 &#x1f468;‍&#x1f4bb;‍个人主页&#xff1a; 魔术师 &#x1f4d6;学习方向&#xff1a; 主攻前端方向&#xff0c;正逐渐往全栈发展 &#x1f6b4;个人状态&#xff1a; 研发工程师&#xff0c;现效力于政务服务网事业 &#x1f1e8;&#x1f1f3;人生格言&…

在Linux服务器上部署Jupyter Notebook并实现ssh无密码远程访问

Jupyter notebook版本7.4.2&#xff08;这个版本AI提示我Jupyter7&#xff08;底层是 jupyter_server 2.x&#xff09; 服务器开启服务 安装Jupyter notebook 7.4.2成功后&#xff0c;终端输入 jupyter notebook --generate-config 这将在 ~/.jupyter/ 目录下生成 jupyter_…

GPU 超级节点:AWS Trainium2 UltraServer

目录 文章目录 目录时间线Inferentia1Trainium1Inferentia2Trainium2Trainium2 ServerTrainium2 UltraServerTrainium2 UltraClustersTrainium3AWS GPU 实例矩阵与竞品分析SuperNode RackTrn2 ServerTrn2U Server ScaleUp 网络PCIe Gen5&#xff1a;CPU-Trainium2 ScaleUpNeuro…

git仓库中.git 文件很大,怎么清理掉一部分

查询 .git 文件大小&#xff0c;在 git-bash 里执行&#xff08;后面有些命令不能执行&#xff0c;也请在 git-bash 里执行&#xff09; windows11 安装好后右键没有 git bash 命令-CSDN博客 du -sh .git // 592m .git 操作前最好先备份一份&#xff0c;避免推送到远程时出错…

MySQL安装实战指南:Mac、Windows与Docker全平台详解

MySQL作为世界上最流行的开源关系型数据库&#xff0c;是每位开发者必须掌握的基础技能。本指南将手把手带你完成三大平台的MySQL安装&#xff0c;从下载到配置&#xff0c;每个步骤都配有详细说明和截图&#xff0c;特别适合新手学习。 一、Mac系统安装MySQL 1.1 通过Homebre…

Rocky Linux 远程服务器画面GUI传输到本地显示教程——Xming

Rocky Linux 远程服务器画面GUI传输到本地显示教程——Xming 下载Xming安装Xming安装Xming字体Xming的使用设置测试 Xming可以提供GUI环境&#xff0c;在Linux服务器上执行GUI应用时&#xff0c;可通过Xming在Windows上执行GUI操作。 下载Xming 下载链接&#xff1a;https://…

游戏引擎学习第283天:“让‘Standing-on’成为一个更严谨的概念

如果同时使用多个OpenGL上下文&#xff0c;并且它们都有工作负载&#xff0c;GPU或GPU驱动程序如何决定调度这些工作&#xff1f;我注意到Windows似乎优先处理活动窗口的OpenGL上下文&#xff08;即活动窗口表现更好&#xff09;&#xff0c;挺有意思的…… 当多个OpenGL上下文…

React集成百度【JSAPI Three】教程(001):快速入门

文章目录 1、快速入门1.1 创建react项目1.2 安装与配置1.3 静态资源配置1.4 配置百度地图AK1.5 第一个DEMO1、快速入门 JSAPI Three版本是一套基于Three.js的三维数字孪生版本地图服务引擎,一套引擎即可支持2D、2.5D、3D全能力的地理投影与数据源加载,帮助开发者轻松搞定平面…

python学习day2

今天主要学习了变量的数据类型&#xff0c;以及如何使用格式化符号进行输出。 一、认识数据类型 在python里为了应对不同的业务需求&#xff0c;也把数据分为不同的类型。 代码如下&#xff1a; """ 1、按类型将不同的变量存储在不同的类型数据 2、验证这些…

【C++】模版(1)

目录 1. 泛型编程 2. 函数模版 2.1 函数模版概念 2.2 函数模版格式 2.3 函数模版的原理 2.4 函数模版实例化方式 隐式实例化 显式实例化 2.5 模版参数的匹配原则 3. 模版类 模版类的定义格式 模版类的实例化 1. 泛型编程 如何实现一个通用的交换函数呢&#xff1f…