【opencv】大津法二值化
2016-03-12 14:17
381 查看
大津法代码
int otsuThreshold(IplImage* img) { int T = 0;//阈值 int height = img->height; int width = img->width; int step = img->widthStep; int channels = img->nChannels; uchar* data = (uchar*)img->imageData; double gSum0;//第一类灰度总值 double gSum1;//第二类灰度总值 double N0 = 0;//前景像素数 double N1 = 0;//背景像素数 double u0 = 0;//前景像素平均灰度 double u1 = 0;//背景像素平均灰度 double w0 = 0;//前景像素点数占整幅图像的比例为ω0 double w1 = 0;//背景像素点数占整幅图像的比例为ω1 double u = 0;//总平均灰度 double tempg = -1;//临时类间方差 double g = -1;//类间方差 double Histogram[256]={0};// = new double[256];//灰度直方图 double N = width*height;//总像素数 for(int i=0;i<height;i++) {//计算直方图 for(int j=0;j<width;j++) { double temp =data[i*step + j * 3] * 0.114 + data[i*step + j * 3+1] * 0.587 + data[i*step + j * 3+2] * 0.299; temp = temp<0? 0:temp; temp = temp>255? 255:temp; Histogram[(int)temp]++; } } //计算阈值 for (int i = 0;i<256;i++) { gSum0 = 0; gSum1 = 0; N0 += Histogram[i]; N1 = N-N0; if(0==N1)break;//当出现前景无像素点时,跳出循环 w0 = N0/N; w1 = 1-w0; for (int j = 0;j<=i;j++) { gSum0 += j*Histogram[j]; } u0 = gSum0/N0; for(int k = i+1;k<256;k++) { gSum1 += k*Histogram[k]; } u1 = gSum1/N1; //u = w0*u0 + w1*u1; g = w0*w1*(u0-u1)*(u0-u1); if (tempg<g) { tempg = g; T = i; } } return T; }
相关文章推荐
- Java开发必会的Linux命令
- VR相关网站
- nginx 优化(突破十万并发)
- Nginx 和 Apache 开启目录浏览功能
- 构造一个简单的Linux系统MenuOS
- centos install shutter (How to enable Nux Dextop repository on CentOS or RHEL)
- 嵌入式linux:Linux下添加新硬盘,分区及挂载
- Hadoop知识结构图
- CentOS安装proftpd
- linux stat函数(获取文件详细信息)
- 正则化方法:L1和L2 regularization、数据集扩增、dropout
- OpenCV学习笔记(一):如何绘图
- 在CentOS 7中安装Docker
- CentOS中安装与配置Tomcat-8方法
- Apache solr和elastic search的比较
- week3-构造一个简单的linux系统
- 为archlinux安装mplayer
- Linux+Apache+Tomcat 负载均衡
- Linux 下SVN 命令行的使用
- event 事件 clientX 和clientY 配合scrollTop使用, div跟着鼠标走