介绍

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

1) 先计算图像的直方图,即将图像所有的像素点按照0~255共256个bin,统计落在每个bin的像素点数量

2) 归一化直方图,也即将每个bin中像素点数量除以总的像素点

3) i表示分类的阈值,也即一个灰度级,从0开始迭代

4) 通过归一化的直方图,统计0~i 灰度级的像素(假设像素值在此范围的像素叫做前景像素) 所占整幅图像的比例w0,并统计前景像素的平均灰度u0;统计i~255灰度级的像素(假设像素值在此范围的像素叫做背景像素) 所占整幅图像的比例w1,并统计背景像素的平均灰度u1;

5) 计算前景像素和背景像素的方差 g = w0*w1*(u0-u1) (u0-u1)

6) i++;转到4),直到i为256时结束迭代

7)将最大g相应的i值作为图像的全局阈值

代码:

  1. #include <opencv2/opencv.hpp>
  2. #include <opencv2/core.hpp>
  3. #include <opencv2/imgproc.hpp>
  4. #include <opencv2/highgui.hpp>
  5. using namespace cv;
  6. using namespace std;
  7. //输入图像,输出阈值
  8. int otsu(IplImage *image)
  9. {
  10. assert(NULL != image);
  11. int width = image->width;
  12. int height = image->height;
  13. int x = 0, y = 0;
  14. int pixelCount[256];
  15. float pixelPro[256];
  16. int i, j, pixelSum = width * height, threshold = 0;
  17. uchar* data = (uchar*)image->imageData;
  18. //初始化
  19. for (i = 0; i < 256; i++)
  20. {
  21. pixelCount[i] = 0;
  22. pixelPro[i] = 0;
  23. }
  24. //统计灰度级中每个像素在整幅图像中的个数
  25. for (i = y; i < height; i++)
  26. {
  27. for (j = x; j < width; j++)
  28. {
  29. pixelCount[data[i * image->widthStep + j]]++;
  30. }
  31. }
  32. //计算每个像素在整幅图像中的比例
  33. for (i = 0; i < 256; i++)
  34. {
  35. pixelPro[i] = (float)(pixelCount[i]) / (float)(pixelSum);
  36. }
  37. //经典ostu算法,得到前景和背景的分割
  38. //遍历灰度级[0,255],计算出方差最大的灰度值,为最佳阈值
  39. float w0, w1, u0tmp, u1tmp, u0, u1, u, deltaTmp, deltaMax = 0;
  40. for (i = 0; i < 256; i++)
  41. {
  42. w0 = w1 = u0tmp = u1tmp = u0 = u1 = u = deltaTmp = 0;
  43. for (j = 0; j < 256; j++)
  44. {
  45. if (j <= i) //背景部分
  46. {
  47. //以i为阈值分类,第一类总的概率
  48. w0 += pixelPro[j];
  49. u0tmp += j * pixelPro[j];
  50. }
  51. else       //前景部分
  52. {
  53. //以i为阈值分类,第二类总的概率
  54. w1 += pixelPro[j];
  55. u1tmp += j * pixelPro[j];
  56. }
  57. }
  58. u0 = u0tmp / w0;//第一类的平均灰度
  59. u1 = u1tmp / w1;//第二类的平均灰度
  60. u = u0tmp + u1tmp;//整幅图像的平均灰度
  61. //计算类间方差
  62. deltaTmp = w0 * (u0 - u)*(u0 - u) + w1 * (u1 - u)*(u1 - u);
  63. //找出最大类间方差以及对应的阈值
  64. if (deltaTmp > deltaMax)
  65. {
  66. deltaMax = deltaTmp;
  67. threshold = i;
  68. }
  69. }
  70. //返回最佳阈值;
  71. return threshold;
  72. }
  73. int main(int argc, char* argv[])
  74. {
  75. IplImage* srcImage = cvLoadImage("1.jpg", 0);
  76. assert(NULL != srcImage);
  77. cvNamedWindow("src");
  78. cvShowImage("src", srcImage);
  79. IplImage* biImage = cvCreateImage(cvGetSize(srcImage), 8, 1);
  80. //计算最佳阈值
  81. int threshold = otsu(srcImage);
  82. //对图像二值化
  83. cvThreshold(srcImage, biImage, threshold, 255, CV_THRESH_BINARY);
  84. cvNamedWindow("binary");
  85. cvShowImage("binary", biImage);
  86. cvWaitKey(0);
  87. cvReleaseImage(&srcImage);
  88. cvReleaseImage(&biImage);
  89. cvDestroyWindow("src");
  90. cvDestroyWindow("binary");
  91. return 0;
  92. }

缺陷

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

转载自:https://www.baidu.com/link?url=21OGa8h2Y_vtzmcp6069mpnezweNfZu-pvgyc5mX9kkzEwAd1uFQelWPzl0JORF_fVg2vDOvevLm9U4GHCobHmGi7ISbTk6QezPQ7FQf4eG&wd=&eqid=c933dd3e00041dbc000000045c727c44

OSTU大律法二值化原理相关推荐

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

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

  2. C++实现大津二值化算法

    文章目录 一.大津算法 二.原理 三.算法实现步骤 四.测试结果 五.完整代码 一.大津算法 大津算法(Ostu)也称最大类间方差法.顾名思义,就使两个类别之间某个属性的方差最大的方法.在图像处理中, ...

  3. 大津二值化算法 ( Otsu's binarization ) 自动确定二值化图像时的阈值

    大津算法,也被称作最大类间方差法,是一种自动确定二值化阈值的算法. 在这里作者不介绍算法推导的过程,算法推导过程网络上有许多介绍,这里只给出算法最终推导出的结论: 使得左侧 的值最大,就可以得到最好的 ...

  4. opencv自适应二值化原理

    opencv自适应二值化原理 先对图像做模糊处理(一般是均值或者高斯模糊).(这里可以加上自己的操作,做一些其他类型的模糊以及一些形态学的操作). 用原图与模糊处理之后的图像做差得到一幅图像. 判断图 ...

  5. otus阈值分割matlab,OSTU最佳阈值法二值化原理-matlab和C | 学步园

    觉得这篇介绍OTSU方法挺清楚的.自己又加了一些,希望对初学者有帮助哦~ OTSU 1. OTSU算法原理简介 对于一幅图像,设当前景与背景的分割阈值为t时,前景点占图像比例为w0,均值为u0,背景点 ...

  6. opencv学习5——大律二值化(ostu)

    opencv中有多种方法进行图像的二值化,前面的3中直接设置二值化的阈值,比较粗暴无脑,而且用人眼看的话根本看不出来最佳阈值,因此人为的设置阈值是一种很不科学不严谨的方法,在opencv中ostu二值 ...

  7. 二值图填充原理 matlab,图像Ostu二值化原理及matlab实现代码

    Ostu假设图像是由前景区域和背景区域两部分组成的,通过遍历计算不同阈值(通常为[0 255]区间范围内)下分割结果中前景区域和背景区域的灰度直方图,然后比较两者之间的方差,使得方差最大化的那个灰度阈 ...

  8. 大津二值化算法(Otsu)

    1. 简介 我们在最灰度图做二值化时,需要设定一个分割阈值,我们并没有一个万能的阈值.而Otsu大津算法则是根据灰度图本身的信息,自动确定最佳阈值,实现以最佳阈值对灰度图进行二值化. 需要注意的是,大 ...

  9. 数字图像处理(四)大津二值化

    题目:使用大津二值化算法进行二值化时阈值的确定. 采用国际标准测试图像Lena. 算法原理 我们在对图片进行二值化时,是希望将图片分割成两部分,称之为前景和背景.一般情况下,我们将感兴趣的部分称为前景 ...

最新文章

  1. 【MATLAB】矩阵运算之矩阵分解
  2. 安卓9全局圆角_三星S9+升级最新系统ONE UI体验,安卓9.0带来哪些惊喜?
  3. C#后台创建Excel文件的那点事儿
  4. 删除360浏览器新标签页内的热词导航
  5. html4符合web的标准吗,在生成HTML,表格等时,CakePhp是否“符合标准”?
  6. 【Python】IDE环境Pycharm运行虚拟环境Django
  7. 一个简单的基于 DirectShow 的播放器 2(对话框类)
  8. 目标追踪论文之狼吞虎咽(5):基于张量的图嵌入半监督学习及其在判别式目标追踪的应用
  9. 计算机截图方法,电脑7种快速截图方法,很多人都不知道!
  10. thinkpad电源管理解决办法 win2019
  11. Alien Skin Exposure v6.x 最新通用完整版汉化补丁
  12. 网红茶饮难逃“短命”之殇,喜茶能否打破这个魔咒?
  13. mysql数据库慕课答案_智慧树MySQL数据库设计与应用慕课答案
  14. 二次函数回归方程_高三专题||【导数专题四】利用导数研究函数图形专项习题...
  15. 【最短路】Graph practice T2 drive 题解
  16. 100V降压图纸 电路最简单的高压降压解决方案
  17. Springboot+Vue实现简单的前端后分离数据交互
  18. python投掷骰子实验实验结论_Python 投掷骰子,并用pygal制图画出统计结果
  19. 【BZOJ4889】[Tjoi2017]不勤劳的图书管理员 分块+树状数组
  20. 什么是服务器版操作系统,服务器版操作系统是什么

热门文章

  1. 容器编排技术 -- kubeadm 实现细节
  2. Spring Cloud Consul 基础使用介绍
  3. 2018年最佳Linux服务器发行版
  4. CCF 201412-1 门禁系统
  5. 64位下搭载汇编环境
  6. 【Python爬虫】Request库入门
  7. spring架构初学者_完整的厨师和基础架构初学者指南
  8. php 现代排序_这就是现代PHP的样子
  9. redshift 数据仓库_您如何使用Amazon Redshift Spectrum访问“暗数据”
  10. Django的url反向解析