自适应二值化能够根据图像的局部特征自动调整阈值,从而更好地适应图像中的局部变化。这种局部适应性使得自适应二值化在处理具有不同光照条件、对比度和纹理的图像时表现出色。通过自适应地选择阈值,自适应二值化能够增强图像的对比度,使图像中的细节更加清晰可见。这对于后续的图像分析和处理非常重要,因为它可以提高特征提取的准确性和可靠性。
常规的二值化方法(一般就是固定阈值法)就是设置一个固定的阈值,图像中大于阈值的变为255(或0),小于阈值的变为0(或255)。此方法是最简单的一种二值化方法。使用一个固定的“标准”(也就是阈值)来判断像素是黑还是白,会遇到麻烦。因此其适应性不强,有着局限性。比如,某张照片的左边很亮,右边很暗,用一个标准去分,左边的暗点和右边的亮点可能都会被分错。这就像是用一把尺子去量不同高度的山,尺子太短或太长都不合适。
自适应二值化就像是一个聪明的“裁判”,它不是用一把尺子去量,而是根据每个地方的情况来调整标准。它会看每个像素周围的小区域(比如周围11个像素),根据这个小区域的平均亮度来决定这个像素的“标准”。
自适应二值化平均值算法广泛应用于以下场景: - 文档扫描:在文档扫描中,如果纸张上有阴影或光反射,全局二值化可能无法正确识别文字。自适应二值化方法能够根据文字和背景的局部光照差异,准确提取出文字内容。 - 图像分割:在医学影像分析中,医生可以通过自适应二值化算法对MRI或CT扫描图像进行分割,以便更准确地定位病变区域。 - 目标检测与识别:在无人车导航中,自适应二值化算法可以用于实时提取道路标志牌信息,为无人车提供导向依据。
优点: - 适应复杂背景:能够根据图像局部特征动态调整阈值,适应背景复杂或光照不均匀的情况。 - 局部适应性:每个像素的阈值是根据其邻域的平均值计算的,因此可以更准确地分割前景和背景。
缺点: - 计算量较大:需要为每个像素计算邻域的平均值,因此计算量比全局二值化大。
常用的自适应二值化算法有以下两种:

代码实现:
import cv2
# 读取图像
image = cv2.imread('./images/jpg/bird01.jpg', cv2.IMREAD_GRAYSCALE)
# 检查图像是否被成功读取
if image is None:
raise ValueError("图像未找到,请检查路径!")
# 自适应二值化
adaptive_thresh = cv2.adaptiveThreshold(image, 255,
cv2.ADAPTIVE_THRESH_MEAN_C,
cv2.THRESH_BINARY,
11, 2)
# 显示图像
cv2.imshow('Original Image', image)
cv2.imshow('Adaptive Thresholding', adaptive_thresh)
# 等待按键
cv2.waitKey(0)
cv2.destroyAllWindows()

cv2.adaptiveThreshold方法参数详解:

常用的高斯模板有如下几种形式:

上图所示是常用的两种高斯模板, 左侧是常用的3 * 3的高斯模板,右侧是常用的5*5高斯模板。高斯模板中的参数是通过高斯函数计算出来的,这里不详细展开讲解。
代码实现:
import cv2
# 读取图像
image = cv2.imread('./images/jpg/bird01.jpg', cv2.IMREAD_GRAYSCALE)
# 检查图像是否被成功读取
if image is None:
raise ValueError("图像未找到,请检查路径!")
# 自适应二值化
adaptive_thresh = cv2.adaptiveThreshold(image, 255,
cv2.ADAPTIVE_THRESH_GAUSSIAN_C,
cv2.THRESH_BINARY,
11, 2)
# 显示图像
cv2.imshow('Original Image', image)
cv2.imshow('Adaptive Thresholding', adaptive_thresh)
# 等待按键
cv2.waitKey(0)
cv2.destroyAllWindows()

以3*3为例子的高斯模板的模板系统推导过程如下:
通常生成一个(2N+1)×(2N+1)大小的高斯模板H,这里是3 *3 所以N=1
