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

发布于:2025-08-16 ⋅ 阅读:(19) ⋅ 点赞:(0)


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_BINARY maxval 0
cv2.THRESH_BINARY_INV 0 maxval
cv2.THRESH_TRUNC thresh 原灰度值
cv2.THRESH_TOZERO 原灰度值 0
cv2.THRESH_TOZERO_INV 0 原灰度值

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 自动阈值算法


网站公告

今日签到

点亮在社区的每一天
去签到