【youcans 的 OpenCV 例程200篇】166.自适应阈值处理

欢迎关注 『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.2
    imgBlur = cv2.boxFilter(img, -1, (5,5))  # 盒式滤波器,均值平滑
    localThresh = img - (1.0-ratio) * imgBlur
    binaryBox = np.ones_like(img) * 255  # 创建与 img 相同形状的白色图像
    binaryBox[localThresh<0] = 0

    plt.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更新】

猜你喜欢

转载自blog.csdn.net/youcans/article/details/124400691