OpenCV 阈值处理详解
阈值处理的作用,其实就是用一个简单的“分界线”把图像分成不同区域,让我们更容易分析和处理有用的部分。
1. 核心作用
分离前景和背景
把关心的物体(前景)和背景分开,方便后续分析
例如:黑底白字的文档 → 提取白色文字部分
简化图像数据
把灰度值压缩为有限几种(常见是黑白两种),减少计算量
适合边缘检测、轮廓提取、特征识别等任务
噪声过滤
某些阈值类型(如
TOZERO
)可以去掉低亮度背景干扰,保留重要区域
预处理步骤
阈值化后图像结构更清晰,利于形态学操作(腐蚀、膨胀)、模板匹配等
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:要处理的图像,可以是单通道或多通道(通常用单通道灰度图),数据类型为
uint8
或float32
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 自动阈值算法