一、閾值分割
閾值分割原理:
一副圖像包括目標、背景和噪聲,設定某一閾值T將圖像分成兩部分:大於T的像素群和小於T的像素群。
在實際處理時候,為了顯示需要一般用255表示背景,用0表示對象物。
由於實際得到的圖像目標和背景之間不一定單純地分布在兩個灰度范圍內,此時就需要兩個或以上的閾值來提取目標。
圖像閾值化分割是一種傳統的最常用的圖像分割方法,因其實現簡單、計算量小、性能較穩定而成為圖像分割中最基本和應用最廣泛的分割技術。它特別適用於目標和背景占據不同灰度級范圍的圖像。難點在於如何選擇一個合適的閾值實現較好的分割。
1.最大方差閾值
最大方差閾值的基本思想是:把直方圖在某一閾值處分割成兩組,當被分成的的兩組之間方差最大時,決定閾值。
設圖像的灰度值為0~m-1級,灰度值i的像素數為ni,此時我們得到像素總數:
然后用T將其分成兩組C0={0~T-1},C1={T~m-1},各組的概率如下
平均值為:
兩組間的方差用下式求出:
從1~m-1之間改變T,求上式為最大時的T,Tmax即為我們需要的閾值。所以上式稱為閾值選擇函數。
算法實現:
View Code
1 /*********************************************************************** 2 * 函數名稱: 3 * threshOtus() 4 * 5 *函數參數: 6 * int histArray[256] -圖像的統計直方圖 7 * 8 * 返回值: 9 * 最佳閾值 10 * 11 *說明:大津閾值選擇函數,給定直方圖數組,根據方差最大原理自動選擇閾值, 12 * 對於彩色圖像,該函數根據亮度直方圖計算閾值 13 ***********************************************************************/ 14 int ImgSegment::threshOtus(int histArray[256]) 15 { 16 //c0和c1組的均值 17 float u0,u1; 18 19 //c0和c1組產生的概率 20 float w0,w1; 21 22 //c0組的像素數 23 int count0; 24 25 //閾值t及記錄方差最大時的最佳閾值maxT 26 int t, maxT; 27 28 //方差及最大方差 29 float devi, maxDevi=0; 30 31 //循環變量 32 int i; 33 34 //統計直方圖中像素的個數,存放在sum中 35 int sum=0; 36 for(i=0;i<256;i++) 37 sum = sum+histArray[i]; 38 39 for(t=0;t<255;t++){ 40 //計算閾值為t時,c0組的均值和產生的概率 41 u0=0; 42 count0=0; 43 for(i=0; i<=t;i++){ 44 u0 += i*histArray[i]; 45 count0 += histArray[i]; 46 } 47 u0=u0/count0; 48 w0=(float)count0/sum; 49 50 //計算閾值為t時,c1組的均值和產生的概率 51 u1=0; 52 for(i=t+1; i<256;i++) 53 u1+=i*histArray[i]; 54 //C0組像素數與C1組像素數之和為圖像總像素數。 55 u1=u1/(sum-count0); 56 w1=1-w0; 57 58 //兩組間的方差 59 devi=w0*w1*(u1-u0)*(u1-u0); 60 61 //記錄最大的方差及最佳閾值位置 62 if(devi>maxDevi){ 63 maxDevi=devi; 64 maxT=t; 65 } 66 67 } 68 69 //返回最佳閾值 70 return maxT; 71 72 }
然后,基於上面的閾值對圖像進行二值化處理,即可得到結果。







