news 2026/10/14 5:41:58

OpenCV cv2.threshold 图像阈值处理详

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
OpenCV cv2.threshold 图像阈值处理详

本文适合OpenCV图像处理入门,讲解cv2.threshold()固定阈值二值化API,包含参数解析、5种阈值模式、示例代码、Otsu自动阈值,可直接复制到CSDN发布。

一、函数简介

阈值处理是图像处理非常基础的操作,常用于图像分割、前景背景分离、形态学预处理。 把灰度图像像素和设定阈值比较,按照不同规则重新赋值像素。

函数原型:

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

返回值

  1. ret:实际生效的阈值。普通阈值就是传入的thresh;使用Otsu算法时为算法自动计算出最优阈值。
  2. dst:阈值处理完成之后的输出图像(单通道)。

参数详解

参数说明
src输入图像,必须为单通道灰度图,彩色图像需要先转为灰度,否则报错
thresh手动设定的阈值,取值范围 0~255
maxval满足判定条件时,像素被赋予的最大值,一般填255(代表白色)
type阈值处理模式,共5种基础模式,还可以叠加Otsu自动阈值算法

二、五种基础阈值模式

以thresh=127,maxval=255作为例子,对比5种模式处理逻辑。

阈值类型处理逻辑
cv2.THRESH_BINARY像素>阈值 →maxval(255白色);像素≤阈值 →0(黑色)
cv2.THRESH_BINARY_INVBINARY反转。像素>阈值 →0(黑色);像素≤阈值 →maxval(255白色)
cv2.THRESH_TRUNC截断模式。像素>阈值 → 设置为阈值;小于等于阈值像素保持原始灰度不变
cv2.THRESH_TOZERO置零模式。像素>阈值,像素保持原值;像素≤阈值,置为0黑色
cv2.THRESH_TOZERO_INVTOZERO反转。像素>阈值置0黑色;像素≤阈值,像素保持原值

💡注意:

  1. BINARY / BINARY_INV:输出只有0和maxval,真正二值黑白图。
  2. TRUNC / TOZERO系列:保留中间灰度信息,不是纯二值图像。
  3. _INV后缀代表逻辑取反。

三、完整可运行代码

import cv2 import matplotlib.pyplot as plt # 解决matplotlib中文乱码 plt.rcParams["font.family"] = ["SimHei"] plt.rcParams["axes.unicode_minus"] = False # 读取图片并转为灰度图 img = cv2.imread("./imgs/lena.jpg") img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # 5种阈值操作 ret1, thresh1 = cv2.threshold(img_gray, 127, 255, cv2.THRESH_BINARY) ret2, thresh2 = cv2.threshold(img_gray, 127, 255, cv2.THRESH_BINARY_INV) ret3, thresh3 = cv2.threshold(img_gray, 127, 255, cv2.THRESH_TRUNC) ret4, thresh4 = cv2.threshold(img_gray, 127, 255, cv2.THRESH_TOZERO) ret5, thresh5 = cv2.threshold(img_gray, 127, 255, cv2.THRESH_TOZERO_INV) titles = ["原始灰度图","THRESH_BINARY","THRESH_BINARY_INV","THRESH_TRUNC","THRESH_TOZERO","THRESH_TOZERO_INV"] images = [img_gray, thresh1, thresh2, thresh3, thresh4, thresh5] plt.figure(figsize=(12,7)) for i in range(6): plt.subplot(2, 3, i + 1) plt.imshow(images[i], cmap="gray") plt.title(titles[i]) plt.axis("off") plt.tight_layout() plt.show()

四、Otsu大津自动阈值

手动设置固定阈值127,对光照差异大的图片效果很差。Otsu算法可以自动计算全局最优阈值,不需要人工指定。

使用方式:

  1. 基础阈值填0,算法内部自动覆盖。
  2. 使用+叠加cv2.THRESH_OTSU。
# Otsu自动阈值 ret_otsu, dst_otsu = cv2.threshold(img_gray, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU) print(f"Otsu算法自动计算的阈值:{ret_otsu}")

五、应用场景

  1. 目标分割:分割前景物体和背景。
  2. 形态学预处理:腐蚀、膨胀、开闭运算之前,经常先做阈值二值化。
  3. 遥感图像、文档扫描图像预处理,Otsu适合光照不均匀图像。

六、常见踩坑总结

  1. ❌不能直接传入BGR彩色图,threshold只接收单通道灰度图像。
  2. _INV代表逻辑反转,黑白结果颠倒。
  3. TRUNC、TOZERO输出依旧保留灰度,不是只有纯黑纯白。
  4. Otsu算法适合灰度分布双峰的图像,单峰图像效果一般。

如果你需要,我可以继续帮你写自适应阈值adaptiveThreshold的CSDN版本,专门处理明暗分布不均匀图像。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/14 5:41:47

C++20模块接口设计实战:告别头文件地狱,构建高效编译边界

C20 把模块(Modules)正式带进标准之后,“头文件地狱”终于有了官方解法,但真到了落地那一步你会发现:把.h改成.cppm只是最表层的工作,真正拉开差距的是模块接口怎么设计。这篇文章就是聊这件事——C模块接口…

作者头像 李华
网站建设 2026/10/14 5:41:33

MongoDB引用详解:ObjectId、手动引用与DBRef的取舍

说实话,我第一次在 MongoDB 文档里看到_id旁边那串ObjectId("5f8d...")的时候,也完全摸不着头脑。后来才意识到,这其实就是 MongoDB 里的"引用"——一个不存在的类型,却到处都在用。这个系列写到第 44 篇&…

作者头像 李华
网站建设 2026/10/14 5:41:16

零基础!宝塔面板快速部署 GinCdn V1.2.1 主控端(含 Redis 配置)

零基础!宝塔面板快速部署 GinCdn V1.2.1 主控端(含 Redis 配置) GinCdn作为轻量高效的内容分发系统,依托Go语言的高性能特性,是一款自研系统,是中小型企业/个人搭建CDN的优选方案。本文手把手教你用宝塔面…

作者头像 李华
网站建设 2026/10/14 5:40:52

基于SpringBoot+Vue的冷链物流监控系统设计与实现

1. 冷链物流系统概述与行业背景冷链物流系统是保障食品、药品等温度敏感商品在运输、仓储过程中品质安全的关键基础设施。传统冷链管理普遍存在温控数据记录滞后、异常响应不及时、运输路线规划不科学等问题。我们开发的这套BS架构系统,通过物联网设备实时采集温湿度…

作者头像 李华
网站建设 2026/10/14 5:40:52

SpringBoot2+Vue3在线课程管理系统源码实战解析

在线课程管理系统这类项目,在Java Web方向的项目集里一直是高频常客。差不多每隔一段时间就会有同学拿同一个题目来问,但用的技术栈版本五花八门。手里这套基于SpringBoot2 Vue3 MyBatis-Plus MySQL8.0的在线课程管理系统源码,算是把前后端…

作者头像 李华
网站建设 2026/10/14 5:40:25

视觉摄像头边坡监测:能力边界、技术链路与工程化落地实践

1. 从一次误报警说起:视觉方案到底能不能信去年雨季,我参与的一个山区公路边坡监测项目,凌晨三点触发了一次红色预警。值班人员紧急出动,到现场一看,坡面完好,连块小石头都没掉下来。问题出在哪&#xff1f…

作者头像 李华