全局閾值算法分析


因為最近在做數字識別,需要用到自動閾值,重新看了看全局閾值算法,分析寫在這里

(學習了清風似水流的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 }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM