阈值处理(Thresholding)用于将灰度图像转换为二值图像。通过设定一个或多个阈值,可以将图像中的像素分为不同的类别,通常用于分割前景和背景、简化图像、去除噪声等任务。OpenCV 提供了多种阈值处理方法,下面介绍基本阈值处理和自动阈值处理。
基本阈值处理
基本阈值处理方法cv2.threshold
,函数原型如下:
ret, thresh = cv2.threshold(src, thresh, maxval, type)
参数说明:
src
:输入图像,通常是单通道的灰度图像。thresh
:阈值。maxval
:超过或低于阈值时赋予的新值。- type:阈值类型,常见的有以下几种:
cv2.THRESH_BINARY
:如果像素值大于阈值,设置为maxval
;否则设置为 0。cv2.THRESH_BINARY_INV
:如果像素值大于阈值,设置为 0;否则设置为maxval
。cv2.THRESH_TRUNC
:如果像素值大于阈值,设置为阈值;否则保持不变。cv2.THRESH_TOZERO
:如果像素值大于阈值,保持不变;否则设置为 0。cv2.THRESH_TOZERO_INV
:如果像素值大于阈值,设置为 0;否则保持不变。
【示例】
import matplotlib.pyplot as plt
img = cv2.imread('cat.jpg',0)
# 阈值处理只接收一个通道的数据
ret, thresh1 = cv2.threshold(img,127,255,cv2.THRESH_BINARY)
ret, thresh2 = cv2.threshold(img,127,255,cv2.THRESH_BINARY_INV)
ret, thresh3 = cv2.threshold(img,127,255,cv2.THRESH_TRUNC)
ret, thresh4 = cv2.threshold(img,127,255,cv2.THRESH_TOZERO)
ret, thresh5 = cv2.threshold(img,127,255,cv2.THRESH_TOZERO_INV)titles = ['Orininal Image','BINARY','BINARY_INV','TRUNC','TOZERO','TOZERO_INV']
images =[img,thresh1,thresh2,thresh3,thresh4,thresh5]for i in range(6):plt.subplot(2,3,i+1), plt.imshow(images[i],'gray')plt.title(titles[i])plt.xticks([]),plt.yticks([])print(ret)
运行结果:
自动阈值处理
自适应阈值处理适用于图像中光照不均匀或背景复杂的情况。它会根据图像的局部区域自动计算阈值。
cv2.adaptiveThreshold
函数原型如下:
thresh = cv2.adaptiveThreshold(src, maxValue, adaptiveMethod, thresholdType, blockSize, C)
参数说明:
src
:输入图像,通常是单通道的灰度图像。maxValue
:超过或低于阈值时赋予的新值。- adaptiveMethod:自适应方法,常见的有:
cv2.ADAPTIVE_THRESH_MEAN_C
:阈值是邻域的平均值减去常数C
。cv2.ADAPTIVE_THRESH_GAUSSIAN_C
:阈值是邻域的加权平均值减去常数C
。
thresholdType
:阈值类型,通常使用cv2.THRESH_BINARY
或cv2.THRESH_BINARY_INV
。blockSize
:邻域大小,必须是奇数。C
:从平均值或加权平均值中减去的常数。
【示例】
# 自动阈值处理
# 读取图像并转换为灰度图像
img = cv2.imread('cat.jpg', cv2.IMREAD_GRAYSCALE)# 应用自适应阈值处理
adaptive_mean = cv2.adaptiveThreshold(img, 255, cv2.ADAPTIVE_THRESH_MEAN_C, cv2.THRESH_BINARY, 11, 2)
adaptive_gaussian = cv2.adaptiveThreshold(img, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY, 11, 2)# 显示结果
cv2.imshow('Adaptive Mean Thresholding', adaptive_mean)
cv2.imshow('Adaptive Gaussian Thresholding', adaptive_gaussian)cv2.waitKey(0)