Opencv之自适应阈值(Python)

学习资料参考:

张平.《OpenCV算法精解:基于Python与C++》.[Z].北京.电子工业出版社.2017.


前言

在使用各种阈值处理时,如果在不均匀照明或者灰度值分布不均的情况下,使用全局阈值分割往往达不到我们希望的效果,因此为每一个像素的位置设置一个对应的阈值是可能行的解决方案。


原理详解

在对图像进行如均值平滑、高斯平滑、中值平滑之后,得到的以当前像素为中心的领域内的灰度“平均值”,所以该平均值就可当作阈值的参考值。


实现步骤

假设输入图像为 I I I,高为 H H H、宽为 W W W,平滑算子的尺寸记为 H x W H x W HxW,其中HW都是奇数。
第一步:对图像进行平滑处理,平滑结果记为 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

猜你喜欢

转载自blog.csdn.net/qq_44116998/article/details/124650580
今日推荐