自适应阈值:
当同一幅图像上的不同部分的具有<u>不同亮度</u>时。这种情况下我们需要采用自适应阈值。此时的阈值是根据图像上的每一个小区域计算与其对应的阈值。因此在同一幅图像上的不同区域采用的是不同的阈值,从而使我们能在亮度不同的情况下得到更好的结果。
cv2.adaptiveThreshold(src,x,adaptive_method, threshold_type,block_size,param1)
参数:
src
:指原图像,原图像应该是灰度图。
x
:指当像素值高于(有时是小于)阈值时应该被赋予的新的像素值
adaptive_method
: CV_ADAPTIVE_THRESH_MEAN_C
或 CV_ADAPTIVE_THRESH_GAUSSIAN_C
threshold_type
: 指取阈值类型:
必须是 CV_THRESH_BINARY
, CV_THRESH_BINARY_INV
block_size
: 指用来计算阈值的象素邻域大小: 3, 5, 7, ...
param1
:指与方法有关的参数。对方法CV_ADAPTIVE_THRESH_MEAN_C
和 CV_ADAPTIVE_THRESH_GAUSSIAN_C
, 它是一个从均值或加权均值提取的常数, 尽管它可以是负数。
自适应阈值:
- 对方法
CV_ADAPTIVE_THRESH_MEAN_C
,先求出块中的均值,再减掉param1
。
- 对方法
CV_ADAPTIVE_THRESH_GAUSSIAN_C
,先求出块中的加权和(gaussian), 再减掉param1
。
例:
import cv2
import numpy as np
import matplotlib.pyplot as plt
img = cv2.imread("text1.png",0)
# img = cv2.resize(img,(0,0),fx=0.5,fy=0.5)
# 全局阈值
(t,thresh) = cv2.threshold(img,0,255,cv2.THRESH_BINARY+cv2.THRESH_OTSU)
# 自适应阈值
thresh0 = cv2.adaptiveThreshold(img,255,cv2.ADAPTIVE_THRESH_GAUSSIAN_C,cv2.THRESH_BINARY,5,4)
thresh1 = cv2.adaptiveThreshold(img,255,cv2.ADAPTIVE_THRESH_MEAN_C,cv2.THRESH_BINARY,5,4)
plt.figure(figsize=(8,10))
plt.subplot(221)
plt.imshow(img,cmap="gray")
plt.xlabel("原图",fontproperties='SimHei')
plt.subplot(222)
plt.imshow(thresh,cmap="gray")
plt.xlabel("OTSU阈值",fontproperties='SimHei')
plt.subplot(223)
plt.imshow(thresh0,cmap="gray")
plt.xlabel("自适应高斯阈值",fontproperties='SimHei')
plt.subplot(224)
plt.imshow(thresh1,cmap="gray")
plt.xlabel("自适应均值阈值",fontproperties='SimHei')
plt.show()
输出结果: