欢迎关注 『youcans 的 OpenCV 例程 200 篇』 系列,持续更新中
OpenCV 例程200篇 总目录-202205更新
【youcans 的 OpenCV 例程200篇】166.自适应阈值处理
3.6 自适应阈值处理
噪声和非均匀光照等因素对阈值处理的影响很大,例如光照复杂时 Otsu 算法等全局阈值分割方法的效果往往不太理想,需要使用可变阈值处理。
可变阈值是指对于图像中的每个像素点或像素块有不同的阈值,如果该像素点大于其对应的阈值则认为是前景。
局部阈值分割可以根据图像的局部特征进行处理,与图像像素位置、灰度值及邻域特征值有关。
可变阈值处理的基本方法,是对图像中的每个点,根据其邻域的性质计算阈值。标准差和均值是对比度和平均灰度的描述,在局部阈值处理中非常有效。
OpenCV 提供了函数 cv.adaptiveThreshold 来实现自适应阈值处理。
函数说明:
cv.adaptiveThreshold(src, maxValue, adaptiveMethod, thresholdType, blockSize, C[, dst])
→ dst
函数 cv.adaptiveThreshold 根据参数 adaptiveMethod 来确定自适应阈值的计算方法。
参数说明:
- scr:输入图像,nparray 二维数组,必须是 8-bit 单通道灰度图像!
- dst:输出图像,大小和格式与 scr 相同
- maxValue:为满足条件的像素指定的非零值,具体用法见 thresholdType 说明
- adaptiveMethod:自适应方法选择
- cv.ADAPTIVE_THRESH_MEAN_C:阈值是邻域的均值
- cv.ADAPTIVE_THRESH_GAUSSIAN_C:阈值是邻域的高斯核加权均值
- thresholdType:阈值处理方法
- cv2.THRESH_BINARY:大于阈值时置 maxValue,否则置 0
- cv2.THRESH_BINARY_INV:大于阈值时置 0,否则置 maxValue
- blockSize:像素邻域的尺寸,用于计算邻域的阈值,通常取 3,5,7
- C:偏移量,从邻域均值中减去该常数
例程 11.23:自适应阈值处理
# 11.23 基于局部性质的自适应阈值处理img = cv2.imread("../images/Fig1050a.tif", flags=0)# img = cv2.imread("../images/Fig1043a.tif", flags=0)# OTSU 全局阈值处理histCV = cv2.calcHist([img], [0], None, [256], [0, 256]) # 灰度直方图ret, imgOtsu = cv2.threshold(img, 127, 255, cv2.THRESH_OTSU) # 阈值分割, thresh=T# 自适应局部阈值处理binaryMean = cv2.adaptiveThreshold(img, 255, cv2.ADAPTIVE_THRESH_MEAN_C, cv2.THRESH_BINARY, 5, 3)binaryGauss = cv2.adaptiveThreshold(img, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY, 5, 3)# 自适应局部阈值处理ratio = 0.2imgBlur = cv2.boxFilter(img, -1, (5,5)) # 盒式滤波器,均值平滑localThresh = img - (1.0-ratio) * imgBlurbinaryBox = np.ones_like(img) * 255 # 创建与 img 相同形状的白色图像binaryBox[localThresh<0] = 0plt.figure(figsize=(9, 6))plt.subplot(231), plt.axis('off'), plt.title("Origin")plt.imshow(img, 'gray')plt.subplot(232,yticks=[]), plt.axis([0,255,0,np.max(histCV)])plt.bar(range(256), histCV[:,0]), plt.title("Gray Hist")plt.subplot(233), plt.axis('off'), plt.title("OTSU(T={})".format(ret))plt.imshow(imgOtsu, 'gray')plt.subplot(234), plt.axis('off'), plt.title("Adaptive mean")plt.imshow(binaryMean, 'gray')plt.subplot(235), plt.axis('off'), plt.title("Adaptive Gauss")plt.imshow(binaryGauss, 'gray')plt.subplot(236), plt.axis('off'), plt.title("Adaptive BoxFilter")plt.imshow(binaryBox, 'gray')plt.tight_layout()plt.show()
(本节完)
版权声明:
youcans@xupt 原创作品,转载必须标注原文链接:(https://blog.csdn.net/youcans/article/details/124400691)
Copyright 2022 youcans, XUPT
Crated:2022-4-25
欢迎关注 『youcans 的 OpenCV 例程 200 篇』 系列,持续更新中
欢迎关注 『youcans 的 OpenCV学习课』 系列,持续更新中【youcans 的 OpenCV 例程200篇】158. 阈值处理之固定阈值法
【youcans 的 OpenCV 例程200篇】159. 图像分割之全局阈值处理
【youcans 的 OpenCV 例程200篇】160. 图像处理之OTSU 方法
【youcans 的 OpenCV 例程200篇】161. OTSU 阈值处理算法的实现
【youcans 的 OpenCV 例程200篇】162. 全局阈值处理改进方法
【youcans 的 OpenCV 例程200篇】163. 基于边缘信息改进全局阈值处理
【youcans 的 OpenCV 例程200篇】164.使用 Laplace 边缘信息改进全局阈值处理
【youcans 的 OpenCV 例程200篇】165.多阈值 OTSU 处理方法
【youcans 的 OpenCV 例程200篇】166.自适应阈值处理
【youcans 的 OpenCV 例程200篇】167.基于移动平均的可变阈值处理
更多内容,请见:
【OpenCV 例程200篇 总目录-202206更新】