Threshold
操作(阈值操作)是图像处理中的一种基本技术,用于将图像的像素值进行二值化或分割。其原理是将图像中的每个像素与指定的阈值进行比较,然后根据比较结果将像素值调整为特定的值。
Threshold 操作的工作原理
假设有一个阈值 T
,Threshold
操作的基本步骤如下:
- 对于每个像素值
p
:- 如果
p > T
,将其设置为最大值(例如255
)。 - 如果
p <= T
,将其设置为最小值(例如0
)。
- 如果
这个过程的结果是,将图像中的像素值二值化,形成一种只有黑色和白色的图像,这在很多图像处理任务中非常有用,比如边缘检测、物体检测和图像分割。
常见的 Threshold 操作类型
OpenCV 提供了多种阈值操作类型,通过 cv2.threshold()
函数来实现:
retval, dst = cv2.threshold(src, thresh, maxval, type)
src
: 输入的源图像(通常为灰度图像)。thresh
: 阈值T
。maxval
: 满足条件时要设置的像素值(例如,二值化中的255
)。type
: 阈值操作类型,如下所述。
阈值操作类型
-
cv2.THRESH_BINARY
:- 如果像素值大于阈值,则设置为
maxval
,否则设置为0
。 - 公式:
dst(x, y) = maxval if src(x, y) > thresh else 0
- 如果像素值大于阈值,则设置为
-
cv2.THRESH_BINARY_INV
:cv2.THRESH_BINARY
的反转操作,即如果像素值大于阈值,则设置为0
,否则设置为maxval
。- 公式:
dst(x, y) = 0 if src(x, y) > thresh else maxval
-
cv2.THRESH_TRUNC
:- 如果像素值大于阈值,则将其截断为阈值,否则保持原值。
- 公式:
dst(x, y) = thresh if src(x, y) > thresh else src(x, y)
-
cv2.THRESH_TOZERO
:- 如果像素值大于阈值,则保持原值,否则设置为
0
。 - 公式:
dst(x, y) = src(x, y) if src(x, y) > thresh else 0
- 如果像素值大于阈值,则保持原值,否则设置为
-
cv2.THRESH_TOZERO_INV
:cv2.THRESH_TOZERO
的反转操作,如果像素值大于阈值,则设置为0
,否则保持原值。- 公式:
dst(x, y) = 0 if src(x, y) > thresh else src(x, y)
示例代码
import cv2
# 读取图像并转换为灰度图像
image = cv2.imread('image.jpg', cv2.IMREAD_GRAYSCALE)
# 应用简单的二值化阈值操作
ret, binary_image = cv2.threshold(image, 127, 255, cv2.THRESH_BINARY)
# 显示结果
cv2.imshow('Binary Image', binary_image)
cv2.waitKey(0)
cv2.destroyAllWindows()
使用场景
- 图像二值化: 将灰度图像转化为二值图像,以突出图像中的前景或对象。
- 图像分割: 在图像中提取特定范围的像素值,分离出感兴趣的区域。
- 物体检测: 在预处理步骤中常用,简化图像以便后续的边缘检测或轮廓检测。
Threshold
操作是图像处理中的一个基本工具,广泛应用于各种图像分析和计算机视觉任务中。