http://blog.csdn.net/xiaqunfeng123/article/details/17121195Otsu法是1979年由日本大津提出的。该方法在类间方差最大的情况下是最佳的,即统计鉴别分析中所用的度量。Otsu方法有一个重要的特性,就是它完全以在一幅图像的直方图上执行计算为基础,而直方图是很容易得到的一维阵列。

具体的公式推理及公式细节就不说了,详见 Conzalez 那本书,我是第三版的,在P.479——P.482 上面。

给出具体步骤如下:

1、计算输入图像的直方图,并归一化。

2、计算累积均值mu,以及全局灰度均值。

3、计算被分到类1的概率q1,和被分到类2的概率q2。

4、用公式计算类间方差,sigma = q1*q2*(mu1 - mu2)*(mu1 - mu2)

5、循环寻找类间方差最大值,并记下此时的阈值,即为最佳阈值。

6、利用最佳阈值进行图像阈值化。

关于otsu部分的程序代码如下:

  1. double getThreshVal_Otsu_8u( const Mat& _src )
  2. {
  3. Size size = _src.size();
  4. const int N = 256;
  5. int i, j, h[N] = {0};
  6. unsigned char* src;
  7. //直方图统计
  8. for( i = 0; i < size.height; i++ )
  9. {
  10. src = _src.data + _src.step*i;
  11. j = 0;
  12. for(j = 0; j < size.width; j++ )
  13. h[src[j]]++;
  14. }
  15. //像素平均值
  16. double mu = 0, scale = 1./(size.width*size.height);
  17. for( i = 0; i < N; i++ )
  18. {
  19. mu += i*(double)h[i];//累加均值
  20. }
  21. mu *= scale;//平均
  22. double mu1 = 0, q1 = 0;//q1 ,q2 为类1和类2的概率累积和,mu1=mg*q1
  23. double p_i, q2, mu2, sigma;
  24. double max_sigma = 0, max_val = 0;
  25. //循环求取最大阈值
  26. for( i = 0; i < N; i++ )
  27. {
  28. p_i = h[i]*scale;//直方图归一化
  29. mu1 *= q1;
  30. q1 += p_i;
  31. q2 = 1. - q1;
  32. mu1 = (mu1 + i*p_i)/q1;
  33. mu2 = (mu - q1*mu1)/q2;
  34. sigma = q1*q2*(mu1 - mu2)*(mu1 - mu2);//类间方差
  35. if( sigma > max_sigma )
  36. {
  37. max_sigma = sigma;
  38. max_val = i;//记下使类间方差最大的阈值
  39. }
  40. }
  41. return max_val;//返回阈值
  42. }

注意,上面这部分传递的图像是 Mat 类型的,和 Iplimage 类型在图像参数部分写法上有一点区别,注意区分开来

显示结果如下:

图像处理算法2——Otsu最佳阈值分割法http://blog.csdn.net/xiaqunfeng123/article/details/17121195的更多相关文章

  1. 排序算法 ----(转载::http://blog.csdn.net/hguisu/article/details/7776068)

    1.插入排序—直接插入排序(Straight Insertion Sort) 基本思想: 将一个记录插入到已排序好的有序表中,从而得到一个新,记录数增1的有序表.即:先将序列的第1个记录看成是一个有序 ...

  2. 几种排序算法的比较转自http://blog.csdn.net/keenweiwei/article/details/3697452

    1冒泡排序: 已知一组无需数据a[1],a[2],a[3],a[4],a[5][a[n],将其按升序排列,首先找出这组数据中最大值,将a[1]与a[2]比较,若a[1]大,则交换两者的值,否则不变,在 ...

  3. Bellman-ford算法的学习http://blog.csdn.net/niushuai666/article/details/6791765

    http://blog.csdn.net/niushuai666/article/details/6791765

  4. 七种常见阈值分割代码(Otsu、最大熵、迭代法、自适应阀值、手动、迭代法、基本全局阈值法)

    http://blog.csdn.net/xw20084898/article/details/17564957 一.工具:VC+OpenCV 二.语言:C++ 三.原理 otsu法(最大类间方差法, ...

  5. 【转】七种常见阈值分割代码(Otsu、最大熵、迭代法、自适应阀值、手动、迭代法、基本全局阈值法)

    http://blog.csdn.net/xw20084898/article/details/17564957 一.工具:VC+OpenCV 二.语言:C++ 三.原理 otsu法(最大类间方差法, ...

  6. 灰度图像的自动阈值分割(Otsu 法)

    关于otsu分割方法,这个文章讲的是最好的,清晰易懂,一看就是作者认真思考过的. 因为在看这个算法的时候我就想,如果一个很大的图像上,大部分像素值都在0 - 50范围内,但是有很小一块像素值在240的 ...

  7. OTSU算法学习 OTSU公式证明

    OTSU算法学习   OTSU公式证明 1 otsu的公式如下,如果当前阈值为t, w0 前景点所占比例 w1 = 1- w0 背景点所占比例 u0 = 前景灰度均值 u1 = 背景灰度均值 u = ...

  8. CCF CSP 202012-2 期末预测之最佳阈值

    202012-2 期末预测之最佳阈值 题目背景 考虑到安全指数是一个较大范围内的整数.小菜很可能搞不清楚自己是否真的安全,顿顿决定设置一个阈值 θ,以便将安全指数 y 转化为一个具体的预测结果--&q ...

  9. 【算法导论】最小生成树之Prime法

    关于最小生成树的概念,在前一篇文章中已经讲到,就不在赘述了.下面介绍Prime算法:         其基本思想为:从一个顶点出发,选择由该顶点出发的最小权值边,并将该边的另一个顶点包含进来,然后找出 ...

随机推荐

  1. NuGet安装本地包命令行

    尝试安装本地的NuGet包. 键入 "get-help NuGet" 可查看所有可用的 NuGet 命令. install-package Polly.Net40Async-Sig ...

  2. [CODEVS1912] 汽车加油行驶问题(分层图最短路)

    传送门 吐槽:神tm网络流 dis[i][j][k] 表示到 (i, j) 还有 k 油的最优解 然后跑spfa,中间分一大堆情况讨论 1.当前队头还有油 1.目标点有加油站——直接过去 2.目标点每 ...

  3. FZU Problem 2200 cleaning dp

    Problem Description N个人围成一圈在讨论大扫除的事情,需要选出K个人.但是每个人与他距离为2的人存在矛盾,所以这K个人中任意两个人的距离不能为2,他们想知道共有多少种方法. Inp ...

  4. 解决 Jackson反序列化 Unexpected token ... , expected VALUE_STRING: need JSON String that contains type id (for subtype of ...)

    首先检查是否是 objectMapper.enableDefaultTyping(); 的受害者.优先考虑删除该配置. 使用Jackson把数组的json字符串反序列化为List时候报了个JsonMa ...

  5. 【BZOJ1901】Dynamic Rankings(树套树,树状数组,主席树)

    题意:给定一个N个数的序列,要求维护一个数据结构支持以下两种操作: 1:将第X个数改成Y 2:查询第X到第Y个数里第K小的数是多少 n,m<=10000,a[i]<=10^9 思路:单点修 ...

  6. 【CF721C】Journey(拓扑排序,最短路,DP)

    题意:给一个无环的图,问用不超过T的时间从1到n最多可以经过多少个点.要求输出一条路径. 思路:因为无环,可以用DP做.不过因为时间最短的原因要拓扑排序后再DP,目测由底向上的更新也是可以的. ; . ...

  7. 开始学习es6(一) 搭建个es6的开发环境

    1.开始学习es6 如果想在浏览器跑es6  需要给es6个环境 因为一直用vue-cli全家桶 这样虽然方便 但如果用es6需要跑起个vue全家桶 于是想到可以用gulp搭建个开发环境 首先需要1. ...

  8. 【webstrom】webstrom打开多个项目,webstrom常用快捷键

    1.webstrom打开多个项目 默认情况下一次只能打开一个项目,如果需要打开多个就按照下面的方法 File -> settings -> Directories -> Add Co ...

  9. luogu 1355 神秘大三角 判断点和三角形的位置关系 面积法 叉积法

    题目链接 题目描述 判断一个点与已知三角形的位置关系. 输入输出格式 输入格式: 前三行:每行一个坐标,表示该三角形的三个顶点 第四行:一个点的坐标,试判断该点与前三个点围成三角形的位置关系 (详见样 ...

  10. linux 头文件以及库的路径

    原来在编译的时候可以指定执行时去哪里找需要的lib文件,长知识了 本文详细介绍了Linux 下gcc头文件指定方法,以及搜索路径顺序的问题.另外,还总结了,gcc动态链接的方法以及路径指定,同样也讨论 ...