学习资料参考:
张平.《OpenCV算法精解:基于Python与C++》.[Z].北京.电子工业出版社.2017.
前言
在使用各种阈值处理时,如果在不均匀照明或者灰度值分布不均的情况下,使用全局阈值分割往往达不到我们希望的效果,因此为每一个像素的位置设置一个对应的阈值是可能行的解决方案。
原理详解
在对图像进行如均值平滑、高斯平滑、中值平滑之后,得到的以当前像素为中心的领域内的灰度“平均值”,所以该平均值就可当作阈值的参考值。
实现步骤
假设输入图像为 I I I,高为 H H H、宽为 W W W,平滑算子的尺寸记为 H x W H x W HxW,其中H
和W
都是奇数。
第一步:对图像进行平滑处理,平滑结果记为 f s m o o t h ( I ) f_{smooth}(I) fsmooth(I),其中 f s m o o t h ( I ) f_{smooth}(I) fsmooth(I)可以代表高斯平滑、均值平滑、中值平滑。
第二步:自适应阈值矩阵Tresh = (1 - ratio) * f s m o o t h ( I ) f_{smooth}(I) fsmooth(I),一般令ratio = 0.15。
第三步:利用局部阈值分割的规则:(注意下图中的[大于等于]应该为[小于等于])
进行阈值分割。
Python实现
def adativeTresh(I,winSize,ratio=0.15)
# 均值平滑
I_mean = cv2.boxFilter(I, cv2.CV_32FC1,winSize)
# 原图与平滑结果做差
out = I - (1 - ratio) * I_mean
# 根据阈值对图像进行处理
out[out >= 0] = 255
out[out < 0] = 0
out = out.astype(np.unit8)
return out