当前位置: 首页 > news >正文

计算机视觉(opencv)实战四——图片阈值处理cv2.threshold()


OpenCV 阈值处理详解

阈值处理的作用,其实就是用一个简单的“分界线”把图像分成不同区域,让我们更容易分析和处理有用的部分。


1. 核心作用

  1. 分离前景和背景

    • 把关心的物体(前景)和背景分开,方便后续分析

    • 例如:黑底白字的文档 → 提取白色文字部分

  2. 简化图像数据

    • 把灰度值压缩为有限几种(常见是黑白两种),减少计算量

    • 适合边缘检测、轮廓提取、特征识别等任务

  3. 噪声过滤

    • 某些阈值类型(如 TOZERO)可以去掉低亮度背景干扰,保留重要区域

  4. 预处理步骤

    • 阈值化后图像结构更清晰,利于形态学操作(腐蚀、膨胀)、模板匹配等


2. 常见应用场景

应用领域阈值处理作用示例
文档扫描提取文字,去除背景杂色OCR 文字识别
工业检测识别零件缺陷、裂纹金属表面瑕疵检测
医学影像分离组织、器官区域CT/MRI 图像分析
交通监控车辆检测、车牌识别二值化车牌图片
模式识别简化形状,便于轮廓分析手写数字识别
机器人视觉识别目标物体颜色+阈值结合定位
二维码/条形码识别增强对比度

3. 举个直观例子

比如一张灰度图像,像素值范围是 0~255,我们设阈值 thresh = 175

  • 像素值 > 175 → 设为 255(纯白)

  • 像素值 ≤ 175 → 设为 0(纯黑)

这样一来,图像中亮的区域变成白色,暗的区域变成黑色,你想找的目标区域一下就很清楚了。


1. 阈值处理的概念

阈值处理(Thresholding)是图像分割中最基础、最常用的方法之一,它通过设置一个阈值,将像素点分成两类:

  • 高于阈值的像素:设为指定值或保留原值

  • 低于阈值的像素:设为指定值或保留原值

这种方式能够有效地将图像分成前景和背景,从而便于后续处理。

在 OpenCV 中,使用 cv2.threshold() 来实现阈值处理:

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

参数说明:

  • src:要处理的图像,可以是单通道或多通道(通常用单通道灰度图),数据类型为 uint8float32

  • thresh:阈值

  • maxval:在某些类型(如 THRESH_BINARY)中,当像素值满足条件时赋予的最大值

  • type:阈值类型(见下表)

  • retval:实际使用的阈值(通常等于 thresh,除非使用自动阈值算法如 THRESH_OTSU


2. 阈值类型对比表

type像素值 > 阈值时输出<阈值时输出
cv2.THRESH_BINARYmaxval0
cv2.THRESH_BINARY_INV0maxval
cv2.THRESH_TRUNCthresh原灰度值
cv2.THRESH_TOZERO原灰度值0
cv2.THRESH_TOZERO_INV0原灰度值

3. 代码示例

import cv2# 读取灰度图
image = cv2.imread('tiger.jpg', flags=0)  # flags=0 表示灰度模式# 各种阈值处理方式
ret, binary = cv2.threshold(image, 175, 255, cv2.THRESH_BINARY)
ret1, binaryinv = cv2.threshold(image, 175, 255, cv2.THRESH_BINARY_INV)
ret2, trunc = cv2.threshold(image, 175, 255, cv2.THRESH_TRUNC)
ret3, tozero = cv2.threshold(image, 175, 255, cv2.THRESH_TOZERO)
ret4, tozeroinv = cv2.threshold(image, 175, 255, cv2.THRESH_TOZERO_INV)# 显示结果
cv2.imshow('Gray', image)         # 原灰度图
cv2.imshow('Binary', binary)      # 偏白变纯白,偏黑变纯黑
cv2.imshow('Binary_INV', binaryinv)  # 偏白变纯黑,偏黑变纯白
cv2.imshow('Trunc', trunc)        # 偏白变灰色,偏黑不变
cv2.imshow('ToZero', tozero)      # 偏白保留,偏黑变纯黑
cv2.imshow('ToZero_INV', tozeroinv) # 偏白变纯黑,偏黑保留cv2.waitKey(0)
cv2.destroyAllWindows()

结果:

(可以尝试改变阈值和最大值,更好地理解用法。)

原图:


4. 不同类型的视觉效果

  • THRESH_BINARY
    常用于将前景物体与背景分离,生成黑白二值图。

  • THRESH_BINARY_INV
    BINARY 相反,适用于反色的分割场景。

  • THRESH_TRUNC
    对高亮部分进行截断,保留阴影细节。

  • THRESH_TOZERO
    保留高亮细节,消除背景低值区域。

  • THRESH_TOZERO_INV
    TOZERO 相反,保留低亮细节,去掉高亮部分。


5. 常见应用场景

  • 文档扫描:提取文字,去掉背景干扰

  • 二维码/条形码识别:增强对比度

  • 目标检测预处理:在边缘检测前进行二值化

  • 医学影像:分离感兴趣区域(ROI)

  • 工业检测:检测瑕疵、裂纹


6. 小结

  • 阈值处理是图像分割的基础工具,简单高效

  • 选择合适的阈值类型可以保留关键信息或突出目标

  • 在复杂光照条件下,可以结合自适应阈值或 Otsu 自动阈值算法

http://www.lryc.cn/news/621912.html

相关文章:

  • Android RxJava变换操作符详解
  • 从0开始学习Java+AI知识点总结-15.后端web基础(Maven基础)
  • 使用 PyQt5 构建 Python 人脸采集系统实战指南
  • 16进制pcm数据转py波形脚本
  • 来火山引擎「算子广场」,一键处理多模态数据
  • 标题:移动端安全加固:发散创新,筑牢安全防线引言:随着移动互联网
  • OpenCV Python——VSCode编写第一个OpenCV-Python程序 ,图像读取及翻转cv2.flip(上下、左右、上下左右一起翻转)
  • 【数据结构初阶】--排序(三):冒泡排序、快速排序
  • 有红帽认证证书可以0元置换华为openEuler-HCIA/HCIP认证
  • html抽奖功能
  • 【Twincat3】IO的SCAN 不可选中,SCAN中后扫描不到设备
  • langGraph--2--langServe+langGraph示例
  • 高等数学 8.3 平面及其方程
  • 开发Chrome/Edge插件基本流程
  • 使用 Serverless 架构快速构建基于 Iceberg 的事务型实时数据湖
  • redis6的多线程原理
  • 永磁同步电机控制 第一篇、认识电机
  • 图像生成适配器对比与选择:LoRA、ControlNet、T2I-Adapter 与 IP-Adapter
  • UE UDP通信
  • tun/tap 转发性能优化
  • 记录一下 StarRocks 点查的 Profile Metrics
  • C++结构体详解
  • 局部变量与全局变量的关系及应用
  • 【swift开发】SwiftUI概述 SwiftUI 全面解析:苹果生态的声明式 UI 革命
  • Unity_导航网格
  • 什么是国产化防爆平板?有哪些功能特点?应用在什么场景?
  • Unity与OpenGL中的材质系统详解
  • 【完整源码+数据集+部署教程】孔洞检测系统源码和数据集:改进yolo11-RetBlock
  • 汽车线束高压屏蔽层接地设计
  • uniapp小程序ocr-navigator身份证拍照上传替换方案