1. 區域生長
區域增長方法是根據同一物體區域內象素的相似性質來聚集象素點的
區域增長方法是一種比較普遍的方法,
區域生長是一種串行區域分割的圖像分割方法。
區域生長的原理
區域生長的基本思想是將具有相似性質的像素集合起來構成區域。
圖1給出已知種子點進行區域生長的一個示例。圖1(a)
區域生長是一種古老的圖像分割方法,
區域生長實現的步驟如下:
1. 對圖像順序掃描!找到第1個還沒有歸屬的像素, 設該像素
2. 以(x0, y0)為中心, 考慮(x0, y0)的4鄰域像素(x, y)如果(x0, y0)滿足生長准則, 將(x, y)與(x0, y0)合並(在同一區域內), 同時將(x, y)壓入堆棧;
3. 從堆棧中取出一個像素, 把它當作(x0, y0)返回到步驟2;
4. 當堆棧為空時!返回到步驟1;
5. 重復步驟1 - 4直到圖像中的每個點都有歸屬時。生長結束。
代碼:
/*****************************
*
* /函數名稱:
* RegionGrow()
*
* /輸入參數:
* CDib * pDib - 指向C
* unsigned char * pUnRegion - 指向區域生長結果的指針
*
* /返回值:
* 無
*
* /說明:
* pUnRegion指針指向的數據區存儲了區域生長的
* 對應象素為生長區域,表示為非生長區域
* 區域生長一般包含三個比較重要的問題:
* 1. 種子點的選取
* 2. 生長准則
* 3. 終止條件
* 可以認為,這三個問題需要具體分析,
* 區域生長的結果。
* 本函數的種子點選取為圖像的中心,
* nThreshold, ()終止條件是一直進行到再沒有滿足生長准則需要的象素時為止
*
*****************************
*/
// 在這個代碼中,它認為這張圖片就是一個區域,
void RegionGrow(CDib * pDib, unsigned char * pUnRegion, int nThreshold)
{
static int nDx[]={-1,0,1,
static int nDy[]={0,1,0,-
nThreshold = 20;
// 遍歷圖象的縱坐標
// int y;
// 遍歷圖象的橫坐標
// int x;
// 圖象的長寬大小
CSize sizeImage = pDib->GetDimensions();
int nWidth = sizeImage.cx ;
int nHeight = sizeImage.cy ;
// 圖像在計算機在存儲中的實際大小
CSize sizeImageSave = pDib->GetDibSaveDim();
// 圖像在內存中每一行象素佔用的實際空間
int nSaveWidth = sizeImageSave.cx;
// 初始化
memset(pUnRegion,0,sizeof
// 種子點
int nSeedX, nSeedY;
// 設置種子點為圖像的中心
nSeedX = nWidth /2 ;
nSeedY = nHeight/2 ;
// 定義堆棧,存儲坐標
int * pnGrowQueX ;
int * pnGrowQueY ;
// 分配空間
pnGrowQueX = new int [nWidth*nHeight];
pnGrowQueY = new int [nWidth*nHeight];
// 圖像數據的指針
unsigned char *
// 定義堆棧的起點和終點
// 當nStart=nEnd, 表示堆棧中只有一
int nStart ;
int nEnd ;
//初始化
nStart = 0 ;
nEnd = 0 ;
// 把種子點的坐標壓入棧
pnGrowQueX[nEnd] = nSeedX;
pnGrowQueY[nEnd] = nSeedY;
// 當前正在處理的象素
int nCurrX ;
int nCurrY ;
// 循環控制變量
int k ;
// 圖象的橫縱坐標,用來對當前象素的鄰域進行遍歷
int xx;
int yy;
while (nStart<=nEnd)
{
// 當前種子點的坐標
nCurrX = pnGrowQueX[nStart];
nCurrY = pnGrowQueY[nStart];
// 對當前點的鄰域進行遍歷
for (k=0; k<4; k++)
{
// 4鄰域象素的坐標
xx = nCurrX + nDx[k];
yy = nCurrY + nDy[k];
// 判斷象素(xx,yy) 是
// 判斷象素(xx,yy) 是
// pUnRegion[yy*nWidth+xx]==0 表示還
// 生長條件:判斷象素(xx,
if ( (xx < nWidth) && (xx>=0) && (yy<nHeight) && (yy>=0)
&& (pUnRegion[yy*nWidth+xx]==0)
&& abs(pUnchInput[yy*nSaveWidth+
{
// 堆棧的尾部指針後
nEnd++;
// 象素(xx,yy
pnGrowQueX[
pnGrowQueY[
// 把象素(xx,y
// 同時也表明該象素
pUnRegion[
}
}
nStart++;
}
// 釋放內存
delete []pnGrowQueX;
delete []pnGrowQueY;
pnGrowQueX = NULL ;
pnGrowQueY = NULL ;
}
該代碼的效果不是很好,大概是選擇的生長點不是很好吧。