圖像閾值分割---基本的全局閾值

       由於閾值處理直觀、實現簡單且計算速度快,因此圖像閾值處理在圖像分割中處於核心地位,下面我會爲大家介紹閾值處理的方法,並用OpenCV給出實現的代碼。

第一種:圖像閾值分割---基本的全局閾值

1.  處理流程:

             1.爲全局閾值選擇一個初始估計值T(圖像的平均灰度)。
             2.用T分割圖像。產生兩組像素:G1有灰度值大於T的像素組成,G2有小於等於T像素組成。
             3.計算G1和G2像素的平均灰度值m1和m2;
             4.計算一個新的閾值:T = (m1 + m2) / 2;
             5.重複步驟2和4,直到連續迭代中的T值間的差爲零。

             此種方法主要適用於圖像直方圖有明顯波谷。

2.源代碼:      

/******************************************************************************* 
函數名稱  : BasicGlobalThreshold 
函數描述  : 圖像閾值分割---基本的全局閾值(適合圖像直方圖有明顯波谷)
輸入參數  : N/A
輸出參數  : N/A
返 回 值    : int k1---------------------------------迭代得到的閾值
作     者    : N/A    2013-01-22
處理流程:1.爲全局閾值選擇一個初始估計值T(圖像的平均灰度)。
          2.用T分割圖像。產生兩組像素:G1有灰度值大於T的像素組成,G2有小於等於T像素組成。
          3.計算G1和G2像素的平均灰度值m1和m2;
          4.計算一個新的閾值:T = (m1 + m2) / 2;
          5.重複步驟2和4,直到連續迭代中的T值間的差爲零。
*******************************************************************************/ 
 int CThreasholdProcess::BasicGlobalThreshold(int*pg,int start,int end)
 {
	 int  i,t,t1,t2,k1,k2;
	 double u,u1,u2;    
	 t=0;     
	 u=0;

	 for (i=start;i<end;i++) 
	 {
		 t+=pg[i];        
		 u+=i*pg[i];
	 }

	 k2=(int) (u/t);                          //  計算此範圍灰度的平均值    
	 do 
	 {
		 k1=k2;
		 t1=0;    
		 u1=0;
		 for (i=start;i<=k1;i++) 
		 {             //  計算低灰度組的累加和
			 t1+=pg[i];    
			 u1+=i*pg[i];
		 }

		 t2=t-t1;
		 u2=u-u1;
		 if (t1) 
			 u1=u1/t1;                     //  計算低灰度組的平均值
		 else 
			 u1=0;
		 if (t2) 
			 u2=u2/t2;                     //  計算高灰度組的平均值
		 else 
			 u2=0;
		 k2=(int) ((u1+u2)/2);                 //  得到新的閾值估計值
	 }while(k1!=k2);                           //  數據未穩定,繼續

	 return k1;                              //  返回閾值
 }
3.演示結果

a).被處理的源圖像                                                                                                                         b).基本的全局閾值處理後圖像                                                                      c)源圖直方圖

  

           

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章