由於閾值處理直觀、實現簡單且計算速度快,因此圖像閾值處理在圖像分割中處於核心地位,下面我會爲大家介紹閾值處理的方法,並用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)源圖直方圖