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