OpenCV 基本阈值操作详解
目标
在本教程中,您将学习如何使用 OpenCV 函数执行基本的阈值操作。阈值处理是图像分割中最基础且重要的技术之一,广泛应用于文档扫描、字符识别、物体检测等场景。
阈值理论
什么是阈值?
阈值(Thresholding)是最简单的图像分割方法。其核心思想是将图像中的像素根据强度值与设定的阈值进行比较,从而将感兴趣的区域与背景分离开来。这种分离通常基于对象像素和背景像素之间的灰度差异。
为了区分我们感兴趣的像素与其他像素,我们对每个像素的强度值与一个确定的阈值(thresh)进行比较。一旦确定了哪些像素属于感兴趣区域,就可以将它们设置为特定的值(如 0 表示黑色,255 表示白色),以便后续处理。
阈值的类型
OpenCV 提供了 cv::threshold 函数来执行多种类型的阈值操作。主要包含以下五种类型:
- 阈值二值化 (THRESH_BINARY)
- 阈值二值化反转 (THRESH_BINARY_INV)
- 截断 (THRESH_TRUNC)
- 阈值为零 (THRESH_TOZERO)
- 阈值为零反转 (THRESH_TOZERO_INV)
1. 阈值二值化 (THRESH_BINARY)
如果源像素值大于阈值,则将其设置为最大值(通常为 255),否则设置为 0。
公式: $$\text{dst}(x, y) = \begin{cases} \text{maxVal} & \text{if } \text{src}(x, y) > \text{thresh} \ 0 & \text{otherwise} \end{cases}$$
应用场景:适用于前景比背景亮的情况,例如黑底白字的文档扫描。
2. 阈值二值化反转 (THRESH_BINARY_INV)
如果源像素值大于阈值,则将其设置为 0,否则设置为最大值。
公式: $$\text{dst}(x, y) = \begin{cases} 0 & \text{if } \text{src}(x, y) > \text{thresh} \ \text{maxVal} & \text{otherwise} \end{cases}$$
应用场景:适用于前景比背景暗的情况,例如白底黑字的文本提取。
3. 截断 (THRESH_TRUNC)
如果源像素值大于阈值,则将其值限制为阈值;否则保持不变。
公式: $$\text{dst}(x, y) = \begin{cases} \text{thresh} & \text{if } \text{src}(x, y) > \text{thresh} \ \text{src}(x, y) & \text{otherwise} \end{cases}$$
应用场景:用于平滑图像或去除过亮的噪声点,保留原始灰度信息但不超过特定亮度。
4. 阈值为零 (THRESH_TOZERO)
如果源像素值大于阈值,则保持原值;否则设置为 0。
公式: $$\text{dst}(x, y) = \begin{cases} \text{src}(x, y) & \text{if } \text{src}(x, y) > \text{thresh} \ 0 & \text{otherwise} \end{cases}$$
应用场景:用于提取图像中较亮的部分,抑制暗部噪声。
5. 阈值为零反转 (THRESH_TOZERO_INV)
如果源像素值大于阈值,则设置为 0;否则保持原值。
公式: $$\text{dst}(x, y) = \begin{cases} 0 & \text{if } \text{src}(x, y) > \text{thresh} \ \text{src}(x, y) & \text{otherwise} \end{cases}$$
应用场景:用于提取图像中较暗的部分,抑制亮部干扰。


