OTSU算法概述 含代码
来源:互联网 发布:wms仓储管理系统 php 编辑:程序博客网 时间:2024/04/25 16:55
原文:http://blog.csdn.net/qinjianganying/article/details/6648700
OTSU一维算法,我自己的理解是自适应阈值分割法,通过对灰度图的处理自行得到一个最佳的阈值,并最后用这个阈值二值化灰度图,参考了商丘师范学院的胡颖老师的<<OTSU算法的改进与纠正>>一文,但是我用的时候效果不是很理想,于是自己进行了稍微的变动,
OTSU算法:就是计算出灰度图最佳阈值的算法
1.先对灰度图进行直方图计算并归一化处理,得到0-255之间每个像素在灰度图中出现的概率,即表示为某个像素在灰度图中出现了n个,灰度图总的像素点为N个,则这个像素的出现概率为Pi=n/N
2.每个灰度图可以由阈值k将灰度图分为A,B两大类,很容易得到A,B类在灰度图中的出现概率以及灰度均值
3.计算灰度图A,B类得类间方差,在最佳阈值K处,求得的类间方差最大,也就是类间方差最大的那个时刻的阈值就为灰度图的最佳阈值
下面结合代码讲解
- int ThresholdOtsu(IplImage *src)
- {
- assert(src->nChannels == 1);
- float histogram[256] = {0};
- for(int h=0;h<src->height;h++)
- {
- unsigned char* p = (unsigned char *)src->imageData +h*src->height;
- for(int w=0;w<src->width ;w++)
- {
- histogram[*p++]++;//计算直方图
- }
- }
- int totalpixel = src->width *src->height;
- for(int i=0;i<256;i++)
- histogram[i] =(float) histogram[i]/(float)totalpixel;//归一化直方图
- float maxavgvalue = 0;
- for(int i=0;i<256;i++)
- maxavgvalue = i*histogram[i];//总的灰度均值,其实在这里可将其设为0
- float PA = 0;//A类出现概率
- float PB = 0;//B类出现概率
- float Agrayvalue = 0;//A类灰度均值
- float Bgrayvalue = 0;//B类灰度均值
- float maxvariance = 0;
- float variance ;
- int threshold;
- for(int i=0;i<256;i++)
- {
- PA += histogram[i];
- PB = 1-PA;
- Agrayvalue += i*histogram[i];//A类灰度均值
- Bgrayvalue += maxavgvalue - Agrayvalue;//B类灰度均值
- //Agrayvalue = Agrayvalue/PA;
- //Bgrayvalue = Bgrayvalue/PB;
- variance = PA*(Agrayvalue-maxavgvalue)*(Agrayvalue-maxavgvalue)+PB*(Bgrayvalue-maxavgvalue)*(Bgrayvalue-maxavgvalue);//计算类间方差
- if(variance>maxvariance)
- {
- maxvariance = variance;
- threshold = i;//求得最大类间方差时的像素值,即为最佳阈值
- }
- }
- return threshold;//返回最佳阈值二值化图像
- }
int ThresholdOtsu(IplImage *src){ assert(src->nChannels == 1); float histogram[256] = {0}; for(int h=0;h<src->height;h++) { unsigned char* p = (unsigned char *)src->imageData +h*src->height; for(int w=0;w<src->width ;w++) { histogram[*p++]++;//计算直方图 } } int totalpixel = src->width *src->height; for(int i=0;i<256;i++) histogram[i] =(float) histogram[i]/(float)totalpixel;//归一化直方图 float maxavgvalue = 0; for(int i=0;i<256;i++) maxavgvalue = i*histogram[i];//总的灰度均值,其实在这里可将其设为0 float PA = 0;//A类出现概率 float PB = 0;//B类出现概率 float Agrayvalue = 0;//A类灰度均值 float Bgrayvalue = 0;//B类灰度均值 float maxvariance = 0; float variance ; int threshold; for(int i=0;i<256;i++) { PA += histogram[i]; PB = 1-PA; Agrayvalue += i*histogram[i];//A类灰度均值 Bgrayvalue += maxavgvalue - Agrayvalue;//B类灰度均值 //Agrayvalue = Agrayvalue/PA; //Bgrayvalue = Bgrayvalue/PB; variance = PA*(Agrayvalue-maxavgvalue)*(Agrayvalue-maxavgvalue)+PB*(Bgrayvalue-maxavgvalue)*(Bgrayvalue-maxavgvalue);//计算类间方差 if(variance>maxvariance) { maxvariance = variance; threshold = i;//求得最大类间方差时的像素值,即为最佳阈值 } } return threshold;//返回最佳阈值二值化图像}
将这个算法放入代码中,实现的效果很理想,并且进行形态学运算后效果如下:
- OTSU算法概述 含代码
- OTSU一维算法概述
- OTSU算法
- Otsu算法
- otsu算法
- otsu算法
- Otsu算法
- otsu算法
- OTSU算法
- otsu算法
- Otsu算法
- OTSU算法学习 OTSU公式证明
- 【二值化】Otsu算法
- 大津法 OTSU的算法
- 大津算法 otsu
- 大津法---OTSU算法
- 大津法---OTSU算法
- C++实现otsu算法
- Proxy、Bean工厂和AOP框架
- Objective-C 设计模式-组合模式 (Composite)
- onTouchEvent方法的使用
- NLPIR中文分词系统之Java接口的使用
- jquery dialog打开时,焦点自动在第一个text框上
- OTSU算法概述 含代码
- Definition of 'Main Street'
- 内容提供者学习
- 浅谈五大Python Web开发框架
- PowerDesigner设计数据库后将name自动添加到commit中
- java实现中文汉字的首字母排序
- 在Android项目上启用maven
- GIT & REPO & GERRIT (三)
- Mysql 修改编码