图像二值化算法–大津法OTSU


大津算法是一种图像二值化算法,作用是确定将图像分成黑白两个部分的阈值。

大津法是针对灰度值进行阈值分割二值化,如果是彩色图像的话需要先转化成灰度图再进行计算。

方差越大,相关性越低,黑白越分明。

目的:找出一个灰度值阈值Threshold,对该灰度值以上或以下的像素的分别计算方差,满足Threshold以上计算出来的方差和Threshold以下计算出来的方差的和最大。

# 算法推导:

对于图像 Image[M, N] ,其大小为M x N。有以下信息:

符号 含义
ω0ω_0ω0​ 前景的像素点数占整幅图像的比例
μ0μ_0μ0​ 前景像素平均灰度
ω1ω_1ω1​ 背景的像素点数占整幅图像的比例
μ1μ_1μ1​ 背景像素平均灰度
μμμ 总像素平均灰度
TTT 前景和背景的分割阈值
N0N_0N0​ 灰度值大于阈值的像素个数
N1N_1N1​ 灰度值小于阈值的像素个数
ggg 类间方差

根据变量的含义,可以得出以下关系式:

前后景像素比例:ω0=N0/(M∗N)ω_0 = N_0 / (M * N) ω0​=N0​/(M∗N) ω1=N1/(M∗N)ω_1 = N_1 / (M * N) ω1​=N1​/(M∗N)

数量恒等式:N0+N1=M∗NN_0+N_1 = M * NN0​+N1​=M∗N ω0+ω1=1ω_0 + ω_1 = 1ω0​+ω1​=1

平均灰度值关系:μ=ω0∗μ0+ω1∗μ1μ = ω_0 * μ_0 + ω_1 * μ_1 μ=ω0​∗μ0​+ω1​∗μ1​

方差定义式:g=ω0(μ0−μ)2+ω1(μ1−μ)2g = ω_0 (μ_0 - μ)^2 + ω_1 (μ_1 - μ)^2g=ω0​(μ0​−μ)2+ω1​(μ1​−μ)2
      
将μ代入式g,得到等价公式:g=ω0∗ω1(μ0−μ1)2g = ω_0 * ω_1 (μ_0 - μ_1)^2g=ω0​∗ω1​(μ0​−μ1​)2

# 算法实现(C语言):

Ostu方法又名最大类间差方法,通过统计整个图像的直方图特性来实现全局阈值T的自动选取,其算法步骤为:

  1. 先计算图像的直方图,即将图像所有的像素点按照0~255共256个bin,统计落在每个bin的像素点数量
  2. 归一化直方图,将每个bin中像素点数量除以总的像素点
  3. i 表示分类的阈值,也即一个灰度级,从0开始迭代 i
  4. 通过归一化的直方图,统计0-i 灰度级的像素(前景像素) 所占整幅图像的比例w0,平均灰度u0;统计i-255灰度级的像素(背景像素) * 所占整幅图像的比例w1,并统计背景像素的平均灰度u1;
  5. 计算前景像素和背景像素的方差 g=ω0∗ω1∗(μ0−μ1)∗(μ0−μ1)g = ω_0 * ω_1 * (μ_0 - μ_1) * (μ_0 - μ_1)g=ω0​∗ω1​∗(μ0​−μ1​)∗(μ0​−μ1​)
  6. i++;重复第4、5步,直到 i 为256时结束迭代
  7. 将最大 g 相应的 i 值作为图像的全局阈值

缺陷:OTSU算法在处理光照不均匀的图像的时候,效果会明显不好,因为利用的是全局像素信息。

/**************************************************************************  函数名称:short GetOTSU (unsigned char tmImage[LCDH][LCDW])*  功能说明:大津法求阈值大小*  参数说明:tmImage : 图像数据*  函数返回:无
*************************************************************************/
short GetOTSU (unsigned char tmImage[LCDH][LCDW])
{signed short i, j;unsigned long Amount = 0;unsigned long PixelBack = 0;unsigned long PixelshortegralBack = 0;unsigned long Pixelshortegral = 0;signed long PixelshortegralFore = 0;signed long PixelFore = 0;float OmegaBack, OmegaFore, MicroBack, MicroFore, SigmaB, Sigma; // 类间方差;signed short MinValue, MaxValue;signed short Threshold = 0;unsigned short HistoGram[256];     //原先为unsigned char ,但是同一个灰度值的像素点可能会超过255个,因此造成溢出,扩大数据范围,感谢评论区指正。for (j = 0; j < 256; j++)HistoGram[j] = 0; //初始化灰度直方图for (j = 0; j < LCDH; j++){for (i = 0; i < LCDW; i++){HistoGram[tmImage[j][i]]++; //统计灰度级中每个像素在整幅图像中的个数}}for (MinValue = 0; MinValue < 256 && HistoGram[MinValue] == 0; MinValue++);        //获取最小灰度的值for (MaxValue = 255; MaxValue > MinValue && HistoGram[MinValue] == 0; MaxValue--); //获取最大灰度的值if (MaxValue == MinValue)return MaxValue;         // 图像中只有一个颜色if (MinValue + 1 == MaxValue)return MinValue;        // 图像中只有二个颜色for (j = MinValue; j <= MaxValue; j++)Amount += HistoGram[j];        //  像素总数Pixelshortegral = 0;for (j = MinValue; j <= MaxValue; j++){Pixelshortegral += HistoGram[j] * j;        //灰度值总数}SigmaB = -1;for (j = MinValue; j < MaxValue; j++){PixelBack = PixelBack + HistoGram[j];     //前景像素点数PixelFore = Amount - PixelBack;           //背景像素点数OmegaBack = (float) PixelBack / Amount;   //前景像素百分比OmegaFore = (float) PixelFore / Amount;   //背景像素百分比PixelshortegralBack += HistoGram[j] * j;  //前景灰度值PixelshortegralFore = Pixelshortegral - PixelshortegralBack;  //背景灰度值MicroBack = (float) PixelshortegralBack / PixelBack;   //前景灰度百分比MicroFore = (float) PixelshortegralFore / PixelFore;   //背景灰度百分比Sigma = OmegaBack * OmegaFore * (MicroBack - MicroFore) * (MicroBack - MicroFore);   //计算类间方差if (Sigma > SigmaB)                    //遍历最大的类间方差g //找出最大类间方差以及对应的阈值{SigmaB = Sigma;Threshold = j;}}return Threshold;                        //返回最佳阈值;
}

参考:
https://blog.csdn.net/Galen_xia/article/details/107911867
代码来自龙邱开源库,有改动

【智能车】图像二值化算法--大津法OTSU相关推荐

  1. 一文搞懂图像二值化算法

    传统的机器视觉通常包括两个步骤:预处理和物体检测.而沟通二者的桥梁则是图像分割(Image Segmentation)[1].图像分割通过简化或改变图像的表示形式,使得图像更易于分析. 举个例子,食品 ...

  2. 图像二值化_三角阈值法

    前言 一.三角阈值法是什么? 二.算法原理 1.算法 总结 参考文献 前言 图像二值化有很多方法,比较经典的为OTSU,三角阈值法,本文主要想一探三角阈值法的算法原理. 一.三角阈值法是什么? 三角阈 ...

  3. C#,图像二值化(06)——全局阈值的大津算法(OTSU Thresholding)及其源代码

    1.大津算法OTSU ALGORITHM OTSU算法效果很一般. 最大类间方差法是1979年由日本学者大津(Nobuyuki Otsu)提出的,是一种自适应阈值确定的方法,又叫大津法,简称OTSU, ...

  4. 十三种基于直方图的图像全局二值化算法原理、实现、代码及效果。

    图像二值化的目的是最大限度的将图象中感兴趣的部分保留下来,在很多情况下,也是进行图像分析.特征提取与模式识别之前的必要的图像预处理过程.这个看似简单的问题,在过去的四十年里受到国内外学者的广泛关注,产 ...

  5. otsu阈值分割算法原理_大津二值化算法OTSU的理解

    otsu 大津算法介绍: OTSU算法是由日本学者OTSU于1979年提出的一种对图像进行二值化的高效算法. 利用阈值将原图像分成前景,背景两个图象. 前景:用n1,csum,m1来表示在当前阈值下的 ...

  6. 十三种基于直方图的图像全局二值化算法原理、实现、代码及效果

    十三种基于直方图的图像全局二值化算法实现 1. 什么是基于直方图的图像全局二值化算法 2. 灰度平均值 3. 百分比阈值(P-Tile法) 3. 基于双峰的阈值 3.1 基于平均值的阈值 3.2 基于 ...

  7. C#,图像二值化(18)——全局阈值的模糊集理论算法(Huang Thresholding)与源程序

    1 模糊集理论 模糊集理论,也称为模糊集合论,或简单地称为模糊集,1965年美国学者扎德在数学上创立了一种描述模糊现象的方法-模糊集合论.这种方法把待考察的对象及反映它的模糊概念作为一定的模糊集合,建 ...

  8. matlab确定灰度阈值T,matlab灰度图像二值化【灰度图像二值化算法研究】

    摘要: 在很多图像处理的过程中,经常需要对灰度图像进行二值化.本文对几种常用的图像二值化算法进行了阐述,并通过仿真,进行比较研究.根据实验结果,阐明了各种算法的优缺点. Abstract: The b ...

  9. 二值化算法OTSU源码解析

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 概述: 本文中小编将会跟大家分享一下OpenCV3.1.0中图像二 ...

最新文章

  1. 训练三层BP神经网络实现异或运算 Python 代码实现
  2. better-scroll刷新后才能滑动的解决方案
  3. 51nod 1574 排列转换
  4. (1)memcached应用
  5. 7.4.4 主成分分析 PCA
  6. LeetCode 599. 两个列表的最小索引总和(哈希map)
  7. 【MATLAB】无人驾驶车辆的模型预测控制技术(精简讲解和代码)【运动学轨迹规划】
  8. matlab安装详解
  9. AutoDesk CAD 2014安装VBA Enabler图文教程(附AutoCAD_2014_VBA_Win_64bit下载)
  10. Broken Pipe
  11. 函数sum计算机怎么使用方法,sumif函数的使用方法
  12. oracle14047,Oracle数据库之ORA-14047
  13. 计算机在智能制造专业中的应用,数控技术在智能制造中的应用及发展分析
  14. 计算机学生的理想定位范文,我理想中的学校作文范文(通用3篇)
  15. Java格式化字符串
  16. SQL注入-安全狗apache绕过
  17. centos7.6修改分辨率
  18. UML设计java程序_利用UML序列图设计Java应用程序详解
  19. [唐诗]秋夜喜遇王处士-王绩
  20. IOS开发学习周报(二)

热门文章

  1. 微波——波、电磁、电磁波(一)
  2. 站在巨人的肩膀上:C#编写WindowsService
  3. 建筑CAD导入MAX乱线的解决方案
  4. 安全无边界,广和通携5G模组+AI智慧安防解决方案闪耀CPSE安博会
  5. 题目2:隐式图的搜索问题(实验准备)
  6. Lesson 2英语词类
  7. Mina NIO与BIO了解及Telnet简单测试-Getting Started
  8. 基于JAVA水果销售管理网站计算机毕业设计源码+系统+mysql数据库+lw文档+部署
  9. Linux教程 - 在Shell脚本中声明和使用布尔变量示例
  10. 搜索 ElasticSearch 快速检索的原理(深度好文)