大津法(OTSU)是一种确定图像二值化分割阈值的算法,由日本学者大津于1979年提出。从大津法的原理上来讲,该方法又称作最大类间方差法,因为按照大津法求得的阈值进行图像二值化分割后,前景与背景图像的类间方差最大。 本文记录相关内容。
简介
大津法(OTSU)是图像分割中阈值选取的最佳算法,计算简单,不受图像亮度和对比度的影响,因此在数字图像处理上得到了广泛的应用。它是按图像的灰度特性,将图像分成背景和前景两部分。因方差是灰度分布均匀性的一种度量,背景和前景之间的类间方差越大,说明构成图像的两部分的差别越大,当部分前景错分为背景或部分背景错分为前景都会导致两部分差别变小。因此,使类间方差最大的分割意味着错分概率最小。
- 应用:是求图像全局阈值的最佳方法,应用不言而喻,适用于大部分需要求图像全局阈值的场合。
- 优点:计算简单快速,不受图像亮度和对比度的影响。
- 缺点:对图像噪声敏感;只能针对单一目标分割;当目标和背景大小比例悬殊、类间方差函数可能呈现双峰或者多峰,这个时候效果不好。
- Opencv 官方文档
Otsu 原理
- 核心思想:最大化被阈值分隔的像素类间方差
- 假设存在图像I,色阶为 0-L ,阈值 TH=k 将图像所有像素分为两类 C1(小于TH) 和 C2(大于TH) ,则这两类像素各自的均值就为m_1、m_2,图像全局均值为m_G。同时像素被分为C1和C2类的概率分别为p_1、p_2。因此就有:
- 其中:
- 类间方差表达式为:
- 根据(1,2,4)式,有:
- 此时 sigma^{2} 即为阈值划分后的像素类间方差,遍历所有像素求得最大方差的阈值
事实上到此为止用着就很舒服了,但原文还做了进一步推导
- 灰度级K的累加均值m和图像全局均值mG分别为:
- 那么(3)式可变为:
- 带入(ref{5})式得:
- 遍历所有 k 值得到最大 sigma^{2} 的阈值即可
实现
Opencv 接口
代码语言:javascript复制C : double threshold(InputArray src, OutputArray dst, double thresh, double maxval, int type)
Python: cv2.threshold(src, thresh, maxval, type[, dst]) → retval, dst
- 支持的默认方式为:
- 使用 Otsu 时在参数
type
中填入cv2.THRESH_OTSU
即可
示例代码
代码语言:javascript复制img = mt.cv_rgb_imread('img1.jpg')
res = cv2.threshold(img[:,:,0], 0, 255, cv2.THRESH_OTSU)
PIS(res[1])
参考资料
- https://blog.csdn.net/weixin_40647819/article/details/90179953
- https://zhuanlan.zhihu.com/p/111101737