图像处理算法2——Otsu最佳阈值分割法http://blog.csdn.net/xiaqunfeng123/article/details/17121195
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部分的程序代码如下:
- double getThreshVal_Otsu_8u( const Mat& _src )
- {
- Size size = _src.size();
- const int N = 256;
- int i, j, h[N] = {0};
- unsigned char* src;
- //直方图统计
- for( i = 0; i < size.height; i++ )
- {
- src = _src.data + _src.step*i;
- j = 0;
- for(j = 0; j < size.width; j++ )
- h[src[j]]++;
- }
- //像素平均值
- double mu = 0, scale = 1./(size.width*size.height);
- for( i = 0; i < N; i++ )
- {
- mu += i*(double)h[i];//累加均值
- }
- mu *= scale;//平均
- double mu1 = 0, q1 = 0;//q1 ,q2 为类1和类2的概率累积和,mu1=mg*q1
- double p_i, q2, mu2, sigma;
- double max_sigma = 0, max_val = 0;
- //循环求取最大阈值
- for( i = 0; i < N; i++ )
- {
- p_i = h[i]*scale;//直方图归一化
- mu1 *= q1;
- q1 += p_i;
- q2 = 1. - q1;
- mu1 = (mu1 + i*p_i)/q1;
- mu2 = (mu - q1*mu1)/q2;
- sigma = q1*q2*(mu1 - mu2)*(mu1 - mu2);//类间方差
- if( sigma > max_sigma )
- {
- max_sigma = sigma;
- max_val = i;//记下使类间方差最大的阈值
- }
- }
- return max_val;//返回阈值
- }
注意,上面这部分传递的图像是 Mat 类型的,和 Iplimage 类型在图像参数部分写法上有一点区别,注意区分开来
显示结果如下:
图像处理算法2——Otsu最佳阈值分割法http://blog.csdn.net/xiaqunfeng123/article/details/17121195的更多相关文章
- 排序算法 ----(转载::http://blog.csdn.net/hguisu/article/details/7776068)
1.插入排序—直接插入排序(Straight Insertion Sort) 基本思想: 将一个记录插入到已排序好的有序表中,从而得到一个新,记录数增1的有序表.即:先将序列的第1个记录看成是一个有序 ...
- 几种排序算法的比较转自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]大,则交换两者的值,否则不变,在 ...
- Bellman-ford算法的学习http://blog.csdn.net/niushuai666/article/details/6791765
http://blog.csdn.net/niushuai666/article/details/6791765
- 七种常见阈值分割代码(Otsu、最大熵、迭代法、自适应阀值、手动、迭代法、基本全局阈值法)
http://blog.csdn.net/xw20084898/article/details/17564957 一.工具:VC+OpenCV 二.语言:C++ 三.原理 otsu法(最大类间方差法, ...
- 【转】七种常见阈值分割代码(Otsu、最大熵、迭代法、自适应阀值、手动、迭代法、基本全局阈值法)
http://blog.csdn.net/xw20084898/article/details/17564957 一.工具:VC+OpenCV 二.语言:C++ 三.原理 otsu法(最大类间方差法, ...
- 灰度图像的自动阈值分割(Otsu 法)
关于otsu分割方法,这个文章讲的是最好的,清晰易懂,一看就是作者认真思考过的. 因为在看这个算法的时候我就想,如果一个很大的图像上,大部分像素值都在0 - 50范围内,但是有很小一块像素值在240的 ...
- OTSU算法学习 OTSU公式证明
OTSU算法学习 OTSU公式证明 1 otsu的公式如下,如果当前阈值为t, w0 前景点所占比例 w1 = 1- w0 背景点所占比例 u0 = 前景灰度均值 u1 = 背景灰度均值 u = ...
- CCF CSP 202012-2 期末预测之最佳阈值
202012-2 期末预测之最佳阈值 题目背景 考虑到安全指数是一个较大范围内的整数.小菜很可能搞不清楚自己是否真的安全,顿顿决定设置一个阈值 θ,以便将安全指数 y 转化为一个具体的预测结果--&q ...
- 【算法导论】最小生成树之Prime法
关于最小生成树的概念,在前一篇文章中已经讲到,就不在赘述了.下面介绍Prime算法: 其基本思想为:从一个顶点出发,选择由该顶点出发的最小权值边,并将该边的另一个顶点包含进来,然后找出 ...
随机推荐
- 安装环境 :win64
1.安装环境 :win64 1.1 下载mysql安装包地址: https://dev.mysql.com/downloads/file/?id=476233 2.安装 2.1 解压下载的ZIP压缩包 ...
- BZOJ3534 [Sdoi2014]重建 【矩阵树定理】
题目 T国有N个城市,用若干双向道路连接.一对城市之间至多存在一条道路. 在一次洪水之后,一些道路受损无法通行.虽然已经有人开始调查道路的损毁情况,但直到现在几乎没有消息传回. 辛运的是,此前T国政府 ...
- ideaaaaaaaaa
数据库proxy:可以用作自动化数据逆向SQL test4j/jtester:
- 不需 porting 就可充電的 charger ic。
Origin : 今天同事問我一個關於配有 RT9458 charger ic 的手機的問題, 這手機可能要送到廠商那, 需要 porting charger ic, 看了一下,跟他說這個充電部份不需 ...
- 使用C语言和i2c-dev驱动
原文地址:blog.csdn.NET/wyt2013/article/details/20740659 感谢作者分享. 在本博客的<使用Beaglebone Black的I2C(一)>中, ...
- 无密码登录Linux
配置主机A无密码登录主机B 主机A:192.168.1.110 主机B:192.168.1.111 先确保所有主机的防火墙处于关闭状态. 在主机A上执行如下: 1. $cd ~/.ssh 2. $ss ...
- 正确使用‘trap指令’实现Docker优雅退出
一般应用(比如mariadb)都会有一个退出命令,用户使用类似systemctl stop ****.service方法,停止其服务时,systemd会调用其配置文件注册的退出命令,该命令执行清理资源 ...
- hdu 2078(DFS)
Matrix Time Limit: 2000MS Memory Limit: 30000K Total Submissions: 3845 Accepted: 1993 Descriptio ...
- Wannafly挑战赛2 C.Butterfly(线段树优化枚举)
题目链接 C.Butterfly 令$fd[i][j]$为以$s[i][j]$为起点开始往下走最大连续的‘X’个数 令$fl[i][j]$为以$s[i][j]$为起点开始往左下走最大连续的‘X’个数 ...
- unity3d Resources.Load动态加载资源
初步整理并且学习unity3d资源加载方法,预计用时两天完成入门学习Unity3d常用两种加载资源方案:Resources.Load和AssetBundle Resources.Load就是从一个缺省 ...