简介:

大津法(OTSU)是一种确定图像二值化分割阈值的算法,由日本学者大津于1979年提出。从大津法的原理上来讲,该方法又称作最大类间方差法,因为按照大津法求得的阈值进行图像二值化分割后,前景与背景图像的类间方差最大(何为类间方差?原理中有介绍)。

OTSU算法

OTSU算法也称最大类间差法,有时也称之为大津算法,由大津于1979年提出,被认为是图像分割中阈值选取的最佳算法,计算简单,不受图像亮度和对比度的影响,因此在数字图像处理上得到了广泛的应用。它是按图像的灰度特性,将图像分成背景和前景两部分。因方差是灰度分布均匀性的一种度量,背景和前景之间的类间方差越大,说明构成图像的两部分的差别越大,当部分前景错分为背景或部分背景错分为前景都会导致两部分差别变小。因此,使类间方差最大的分割意味着错分概率最小。

原理:

对于图像I(x,y),前景(即目标)和背景的分割阈值记作T,属于前景的像素点数占整幅图像的比例记为ω0,其平均灰度μ0;背景像素点数占整幅图像的比例为ω1,其平均灰度为μ1。图像的总平均灰度记为μ,类间方差记为g。

假设图像的背景较暗,并且图像的大小为M×N,图像中像素的灰度值小于阈值T的像素个数记作N0,像素灰度大于阈值T的像素个数记作N1,则有:
      ω0=N0/ M×N (1)
      ω1=N1/ M×N (2)
      N0+N1=M×N (3)
      ω0+ω1=1    (4)
      μ=ω0*μ0+ω1*μ1 (5)
      g=ω0(μ0-μ)^2+ω1(μ1-μ)^2 (6)
将式(5)代入式(6),得到等价公式:
      g=ω0ω1(μ0-μ1)^2    (7) 这就是类间方差
采用遍历的方法得到使类间方差g最大的阈值T,即为所求。

matlab函数:

matlab中函数graythresh既是使用大津法求得分割阈值T。用法如下:

      T = graythresh(img);  %得到图像二值化分割的阈值T

      BW = im2bw(img,T);  %对img这个图像做图像二值化阈值分割

大津法的形象理解:

对于直方图有两个峰值的图像,大津法求得的T近似等于两个峰值之间的低谷。

      imhist(img);

T = graythresh(img);

如下图为图像的直方图,使大津法求得的T=0.5294,转换在[0,255]之间为134.9970,只好是两个峰值之间低谷的位置。

OpenCV的二值化操作中,有一种“大津阈值处理”的方法,使用函数cvThreshold(image,image2,0,255,CV_THRESH_OTSU) 实现,该函数就会使用大律法OTSU得到的全局自适应阈值来进行二值化图片,而参数中的threshold不再起作用。

以下是一段在OpenCV中实现的C语言程序,即一个使用OTSU算法提取图像阈值的函数,输入参数为一个图像指针,返回分割该图像的最佳阈值。

其中的变量说明:当分割的阈值为t时

w0为背景像素点占整幅图像的比例

u0为w0平均灰度

w1为前景像素点占整幅图像的比例

u1为w1平均灰度

u为整幅图像的平均灰度

公式:g = w0*pow((u-u0),2) + w1*pow((u-u1),2)

int MyAutoFocusDll::otsuThreshold(IplImage *frame)
{const int GrayScale = 256;int width = frame->width;int height = frame->height;int pixelCount[GrayScale];float pixelPro[GrayScale];int i, j, pixelSum = width * height, threshold = 0;uchar* data = (uchar*)frame->imageData;  //指向像素数据的指针for (i = 0; i < GrayScale; i++){pixelCount[i] = 0;pixelPro[i] = 0;}//统计灰度级中每个像素在整幅图像中的个数  for (i = 0; i < height; i++){for (j = 0; j < width; j++){pixelCount[(int)data[i * width + j]]++;  //将像素值作为计数数组的下标}}//计算每个像素在整幅图像中的比例  float maxPro = 0.0;int kk = 0;for (i = 0; i < GrayScale; i++){pixelPro[i] = (float)pixelCount[i] / pixelSum;if (pixelPro[i] > maxPro){maxPro = pixelPro[i];kk = i;}}//遍历灰度级[0,255]  float w0, w1, u0tmp, u1tmp, u0, u1, u, deltaTmp, deltaMax = 0;for (i = 0; i < GrayScale; i++)     // i作为阈值{w0 = w1 = u0tmp = u1tmp = u0 = u1 = u = deltaTmp = 0;for (j = 0; j < GrayScale; j++){if (j <= i)   //背景部分  {w0 += pixelPro[j];u0tmp += j * pixelPro[j];}else   //前景部分  {w1 += pixelPro[j];u1tmp += j * pixelPro[j];}}u0 = u0tmp / w0;u1 = u1tmp / w1;u = u0tmp + u1tmp;deltaTmp = w0 * pow((u0 - u), 2) + w1 * pow((u1 - u), 2);if (deltaTmp > deltaMax){deltaMax = deltaTmp;threshold = i;}}return threshold;
}

转自: https://www.cnblogs.com/ranjiewen/p/6385564.html 

转载于:https://www.cnblogs.com/YiYA-blog/p/10065985.html

OTSU_图像二值化分割阈值的算法相关推荐

  1. otsu阈值分割算法原理_OTSU_图像二值化分割阈值的算法

    简介: 大津法(OTSU)是一种确定图像二值化分割阈值的算法,由日本学者大津于1979年提出.从大津法的原理上来讲,该方法又称作最大类间方差法,因为按照大津法求得的阈值进行图像二值化分割后,前景与背景 ...

  2. 图像二值化分割阈值的算法——OTSU

    该算法叫做大津算法,由日本学者大津于1979年提出. 该算法的核心在于 前景与背景图像的类间方差最大 MATLAB代码 clear all clcI = imread('1.jpg'); I = rg ...

  3. 【医学图像处理】 2 灰度直方图、图像二值化(阈值分割)

    文章目录 1 灰度直方图 1.1 直方图理解 1.2 直方图计算 1.3 直方图均衡化 1.3.1 全局均衡化 1.3.2 自适应(局部)均值化 2 图像二值化(阈值分割) 2.1 二值化理解 2.2 ...

  4. 基于ImagePy工具的岩块图像二值化分割研究

    看到自己一年前在知乎提的问题了,忍不住回答下. 下面这个是论文录用后修改稿,文末有编辑的评语. 基于ImagePy工具的岩块图像二值化分割研究 摘 要:在岩块图像分析识别前的预处理工作中,为了平滑岩块 ...

  5. OpenCV删除面积小的区域 实现图像二值化分割 标记连通区域

    OpenCV删除面积小的区域 实现图像二值化分割 标记连通区域    [尊重原创,转载请注明出处]http://blog.csdn.net/guyuealian/article/details/781 ...

  6. java 图像二值化阀值,阈值 二值化图像程序

    在Matlab中将一幅图像阈值分割二值化非常简单,若需要通过阈值th2二值化保留一些大面积的.且有灰度值含有大于th1的点的前景区域,而不需要小面积的区域(th1大于th2),这时会遇到这样的问题:当 ...

  7. 图像二值化的阈值求法

    图像二值化的操作,就是寻找一个合适的阈值T,把图像中所有像素值小于等于该阈值的像素点设置为一个像素值,同时把图像中所有像素值大于该阈值的像素点设置为另一个像素值.也就是说,二值化之后整幅图像中只有两种 ...

  8. 图像二值化(选择阈值)

    目录 1. 双峰法 2. 大津法(Otsu法或最大类间方差法) 1. 双峰法 在一些简单的图像中,物体的灰度分布比较有规律,背景与各个目标在图像 的直方图各自形成一个波峰,即区域与波峰一一对应,每两个 ...

  9. VTK修炼之道31:图像二值化_阈值法

    1.阈值法实现图像二值化操作 二值图像和label图像是图像分割中经常用到的两种图像. 二值图像的每个像素只有两种可能的取值,例如0或者255.通常0代表图像的背景,而255代码图像前景.图像二值化是 ...

最新文章

  1. Spring系列教程四:Spring对Bean的管理细节
  2. 网页游戏怎么修改数据_一周网页游戏数据报告(7.14-7.20)
  3. 面向对象编程02—装饰器、类方法、静态方、访问控制
  4. OpenGL GLFW
  5. 自动化设备的软件框架
  6. Leedcode9-linked-list-cycle-i
  7. 作者:​张群(1988-),女,博士,中国电子技术标准化研究院设备与数据研究室副主任。...
  8. 【转】android开发必看资源URL
  9. KL散度 JS散度 熵
  10. java 扫雷 实验报告_java实现简单扫雷
  11. 漫谈基础工业软件开发
  12. python:实现十六进制转二进制算法(附完整源码)
  13. MATLAB-alphaShape三维使用
  14. 『杭电1206』劲乐团
  15. 联发科mt6779(Helio P90),mt6775(Helio P70),MT6771(Helio P60),Helio P35,MT6762(Helio P22)处理器参数介绍
  16. CDH Parcel包starrocks集成cloudera Manager
  17. linux用vi使一个段落对齐,12.8 Linux下vi命令和shell学习
  18. 详解Unity中的粒子系统Particle System (十一)
  19. 华为鸿蒙cpu,华为转投第三大CPU架构RISC-V?首款鸿蒙开发板曝光
  20. Python之路【第二十二篇】:Django之Model操作

热门文章

  1. 使用解码逻辑创建YOLO Core ML对象检测器(四)
  2. WPF:使用WPF应用程序中的默认网络凭据和凭据存储来管理自动登录
  3. SpecFlow的力量
  4. 如何使用.NET Core,SQL和HTML和JavaScript构建CRUD应用程序
  5. Odoo10教程 -- 主题教程
  6. 关于json时间字符串格式化处理
  7. python定义空array_Python惯用技巧
  8. java可以看懂php代码吗_可以自己给自己理发吗?看懂这六点细节就能给自己理发了...
  9. python web 文件管理_我的第一个python web开发框架(23)——代码版本控制管理与接口文档...
  10. python做视频抽帧图_Python提取视频中图片的示例(按帧、按秒)