全局阈值算法分析
因为最近在做数字识别,需要用到自动阈值,重新看了看全局阈值算法,分析写在这里
(学习了清风似水流的CSDN博客:http://blog.csdn.net/ilyhlf5201314/article/details/8525695)
1. 处理流程:
1.为全局阈值选择一个初始估计值T(图像的平均灰度)。
2.用T分割图像。产生两组像素:G1有灰度值大于T的像素组成,G2有小于等于T像素组成。
3.计算G1和G2像素的平均灰度值m1和m2;
4.计算一个新的阈值:T = (m1 + m2) / 2;
5.重复步骤2和4,直到连续迭代中的T值间的差为零。
此种方法主要适用于图像直方图有明显波谷。
2.程序代码:
1 //全局阈值函数 2 //给定一个初始阈值T,在T两边分别计算平均阈值T1和T2,不等,T=(T1+T2)/2,知道两边的平均阈值相等 3 u8 GlobalThreshold(u8 **img, u16 height, u16 width) 4 { 5 u8 pg[256] = {0}; //直方图数组 6 u16 i,j,t=0,t1,t2,k1,k2; 7 double u=0,u1,u2; 8 9 //for (i = 0; i<256; i++) pg[i]=0; 10 for (i = 0; i<height; i++) //直方图统计 11 { 12 for (j = 0; j<width; j++) 13 { 14 pg[ img[i][j] ]++; 15 } 16 } 17 18 19 20 for (i=0;i<256;i++) 21 { 22 t += pg[i]; //计算被统计的像素点数目 23 u += i * pg[i]; //第i阶灰度值*第i阶像素数目 24 } 25 k2 = (u16 )( u/t); //计算被统计像素点灰度的平均值,初始灰度值 26 27 do { 28 k1 = k2; 29 t1 = 0; u1 = 0; 30 for (i = 0; i<=k1; i++) //类似前面,计算低灰度组的累加值 31 { 32 t1 += pg[i]; //计算低灰度组被统计的像素点数目 33 u1 += i * pg[i]; 34 } 35 36 t2 = t - t1; //得到高灰度组的像素点数目 37 u2 = u - u1; //得到高灰度组的加权灰度 38 39 if (t1) 40 u1=u1/t1; //计算低灰度组的平均值 41 else 42 u1=0; 43 44 if (t2) 45 u2=u2/t2; //计算高灰度组的平均值 46 else 47 u2=0; 48 49 k2 = (u16 )((u1 + u2)/2 ); //计算新的阈值 50 }while( k1 != k2); //如果数值未稳定,继续 51 52 return k1; 53 }