前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >二值化算法OTSU源码解析

二值化算法OTSU源码解析

作者头像
OpenCV学堂
发布2018-04-04 10:40:05
1.8K0
发布2018-04-04 10:40:05
举报

概述:

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

一:基本原理

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

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

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

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

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

二:OpenCV实现源代码解析

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

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

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

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

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

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

三:使用

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

运行结果如下:

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

关注【OpenCV学堂】

长按或者扫码下面二维码即可关注

学习《OpenCV图像处理视频课程》

http://edu.51cto.com/course/course_id-7521.html

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2016-12-26,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 OpenCV学堂 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档