概述:

本文中小编将会跟大家分享一下OpenCV3.1.0中图像二值化算法OTSU的基本原理与源代码解析,最终还通过几行代码演示了一下如何使用OTSU算法API实现图像二值化。

一:基本原理

该方法是图像二值化处理常见方法之一,在Matlab与OpenCV中均有实现。OTSU阈值方法是一种基于寻找合适阈值实现二值化的方法,其最重要的部分是寻找图像二值化阈值,然后根据阈值将图像分为前景(白色)或者背景(黑色)。假设有6x6的灰度图像,其像素数据及其对应的直方图如下图:

tesseract java 图片二值化 图像二值化处理代码_opencv


阈值寻找方法首先假设是为T=3,则背景像素的比重、均值、方差的计算结果如下:

tesseract java 图片二值化 图像二值化处理代码_python_02


tesseract java 图片二值化 图像二值化处理代码_opencv_03

然后使用上述计算结果,计算类内方差:

tesseract java 图片二值化 图像二值化处理代码_opencv_04


上述整个计算步骤与结果是假设阈值T=3时候的结果,同样计算假设阈值为T=0、T=1、T=2、T=4、T=5的类内方差,比较类内方差之间的值,最小类内方差使用的阈值T即为图像二值化的阈值。

      上述是假设图像灰度值级别为0~5六个值,实际中图像灰度值取值范围为0~255之间,所以要循环计算使用每个灰度值作为阈值,得到类内方差,最终取最小类内方差对应的灰度值作为阈值实现图像二值化即可。

二:OpenCV实现源代码解析

OTSU的源代码可以参见-modules/imgproc/src/thresh.cpp源文件接口,下面对其中关键部分做出说明如下:

首先建立直方图的代码如下:

tesseract java 图片二值化 图像二值化处理代码_人工智能_05


寻找内方差最小的阈值T的代码实现如下

tesseract java 图片二值化 图像二值化处理代码_计算机视觉_06


上述代码主要功能是实现阈值寻找,多数人看到OpenCV源代码都会对OTSU的原理产生怀疑,明明是寻找最大值啊,原因是这样,最小的内方差值还等价于两类数据的最大方差,公式如下:

tesseract java 图片二值化 图像二值化处理代码_算法_07


代码计算总像素个数实现如下

tesseract java 图片二值化 图像二值化处理代码_算法_08


这样对照一下公式立刻就会读懂OpenCV中的源代码了。

三:使用

使用OTSU算法实现图像二值化,首先要把图像从彩色图像转换为灰度图像然后通过threshold函数指定二值化方法为THRESH_OTSU。具体的代码调用演示如下:

tesseract java 图片二值化 图像二值化处理代码_opencv_09


运行结果如下:

tesseract java 图片二值化 图像二值化处理代码_python_10


上图左边输入RGB图像,右边是基于OTSU产生的二值图像。从OpenCV图像二值化方法OTSU代码实现我们可以看出OpenCV在算法编码实现环节都是从简洁计算入手,考虑效率优先。非常值得我们学习。