全局阈值算法分析

因为最近在做数字识别,需要用到自动阈值,重新看了看全局阈值算法,分析写在这里

(学习了清风似水流的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 }
原文地址:https://www.cnblogs.com/rongfangliu/p/3575898.html