opencv中自适应阈值(adaptiveThreshold()函数)介绍

1. 自适应阈值简介

自适应阈值(adaptiveThreshold(),用于二值化处理图像,对于对比大的图像有较好效果,相对于opencv中固定阈值化操作(threshold()),自适应阈值中图像中每一个像素点的阈值是不同的,该阈值由其领域中图像像素带点加权平均决定。这样做的好处:

  • 每个像素位置处的二值化阈值不是固定不变的,而是由其周围邻域像素的分布来决定的。
  • 亮度较高的图像区域的二值化阈值通常会较高,而亮度较低的图像区域的二值化阈值则会相适应地变小。
  • 不同亮度、对比度、纹理的局部图像区域将会拥有相对应的局部二值化阈值。

2. 自适应阈值参数说明

import cv2 as cv
th2 = cv.adaptiveThreshold(img,255,cv.ADAPTIVE_THRESH_MEAN_C, cv.THRESH_BINARY,11,2)
  • 第一个参数(img):源图像

  • th2:输出图像,与源图像大小一致

  • 第三个参数(255):超过阈值的部分取值是多少(对于cv.THRESH_BINARY而言)

  • 第四个参数(cv.ADAPTIVE_THRESH_MEAN_C):
    (1)在一个邻域内计算阈值所采用的算法,有两个取值,分别为 ADAPTIVE_THRESH_MEAN_C 和 ADAPTIVE_THRESH_GAUSSIAN_C
    (2)ADAPTIVE_THRESH_MEAN_C的计算方法是计算出领域的平均值再减去第七个参数2的值。
    (3)ADAPTIVE_THRESH_GAUSSIAN_C的计算方法是计算出领域的高斯均值再减去第七个参数2的值

  • 第五个参数(cv.THRESH_BINARY):这是阈值类型,只有两个取值,分别为 THRESH_BINARY 和THRESH_BINARY_INV

  • 第六个参数(11):adaptiveThreshold的计算单位是像素的邻域块大小选择,这是局部邻域大小,3、5、7等

  • 第七个参数(2):这个参数实际上是一个偏移值调整量,用均值和高斯计算阈值后,再减或加这个值就是最终阈值。

3. 高斯核的构建

高斯分布,通过概率密度函数来定义高斯分布:
高斯概率分布函数为:
opencv中自适应阈值(adaptiveThreshold()函数)介绍_第1张图片
通过改变函数中μ和σ的值,我们可以得到如下图像,其中均值为μ,标准差为σ
opencv中自适应阈值(adaptiveThreshold()函数)介绍_第2张图片
二维高斯分布函数如下:

此时我们拓展到二维图像,一般情况下我们使x轴和y轴的σ相等并且μ=0,将上式中ρ取为0,此时我们可以得到二维高斯函数的表达式如下,其中σ的大小决定了高斯函数的宽度。
opencv中自适应阈值(adaptiveThreshold()函数)介绍_第3张图片
高斯概率函数是相对于二维坐标产生的,其中(x,y)为点坐标,要得到一个高斯滤波器模板,应先对高斯函数进行离散化,将得到的值作为模板的系数。例如:要产生一个33的高斯滤波器模板,以模板的中心位置为坐标原点进行取样,模板在各个位置的坐标,如下图所示(x轴水平向右,y轴竖直向下)
opencv中自适应阈值(adaptiveThreshold()函数)介绍_第4张图片
标准差 σ =1.3 的 3
3 的整数形式的高斯滤波器如下:
opencv中自适应阈值(adaptiveThreshold()函数)介绍_第5张图片
标准差 σ的值可以任意选取,如果σ较小,那么生成的模板的中心系数较大,而周围的系数较小,这样对图像的平滑效果就不是很明显;反之,σ较大,则生成的模板的各个系数相差就不是很大,比较类似均值模板,对图像的平滑效果比较明显,不管选择什么 σ值,我们构建3*3高斯核的时候要确保这九个点加起来为1,从而得到最终的高斯模板。

4. 测试

import cv2
import numpy as np
from matplotlib import pyplot as plt

img = cv2.imread('1.png', 0)
img = cv2.medianBlur(img, 5)
ret, th1 = cv2.threshold(img, 127, 255, cv2.THRESH_BINARY)
th2 = cv2.adaptiveThreshold(img, 255, cv2.ADAPTIVE_THRESH_MEAN_C, cv2.THRESH_BINARY, 11, 2)
th3 = cv2.adaptiveThreshold(img, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY, 11, 2)
titles = ['Original Image', 'Global Thresholding (v = 127)',
          'Adaptive Mean Thresholding', 'Adaptive Gaussian Thresholding']
images = [img, th1, th2, th3]
for i in range(4):
    plt.subplot(2, 2, i + 1), plt.imshow(images[i], 'gray')
    plt.title(titles[i])
    plt.xticks([]), plt.yticks([])
plt.show()

运行结果如下:
opencv中自适应阈值(adaptiveThreshold()函数)介绍_第6张图片

你可能感兴趣的:(机器学习)