區域增長演算法實現影象分割(網路)
阿新 • • 發佈:2019-02-15
下面程式碼採用堆疊的方式實現了給定種子點的區域生長,該方法步驟如下:
(1)為輸出影象申請緩衝區,並初始化白色;
(2)將種子點入棧,並將輸出影象對應位置編輯黑色;
(3)從棧中彈出一個畫素點(該畫素點已在輸出緩衝區標記過),考察該畫素點的8鄰域中有畫素與種子點灰度差小於給定的閥值T,且該點在輸出影象中沒有被標記過,則將該點入棧,並將輸出影象緩衝區對應位置標記成黑色;
(4)重複步驟(3),直至棧空為止。
而我想實現邊界顯示成白線,其他部分不變的結果。請大家幫幫忙……謝謝
//以下是區域生長程式碼
//迴圈變數
int i, j;
//將輸出影象初始化置255,用0代表畫素的生長標記
for(i=0;i<m_imgHeight;i++){
for(j=0;j<m_imgWidth;j++){
*(m_pImgDataOut+i*lineByte+j)=255;
}
}
//二維陣列direction代表中心畫素點8鄰域座標與該點在x和y方向上的偏移,
//其中第一列為x方向的偏移,第二列為y方向的偏移
int direction[8][2]={{0,1},{1,1},{1,0},{1,-1},{0,-1},{-1,-1},{-1,0},
{-1,1}};
//棧申請,此處假定進棧的畫素最多為影象總畫素數
CPoint *stack=new CPoint[m_imgWidth*m_imgHeight];
//棧頂指標
int top;
//當前正處理的點和彈出的點
CPoint currentPoint, popPoint;
//迴圈變數,遍歷array陣列的第一維下標
int k;
//標記變數
int label;
//臨時變數
int temp1, temp2;
//記錄種子畫素的灰度值
temp1=*(m_pImgData+seed.y*lineByte+seed.x);
//將給定種子點置標記0,入棧
*(m_pImgDataOut+seed.y*lineByte+seed.x)=0;
top=0;
stack[top].x=seed.x;
stack[top].y=seed.y;
//堆疊
while(top>-1){
//彈出棧頂元素,該元素已經生長過
popPoint.x=stack[top].x;
popPoint.y=stack[top].y;
top--;
//考察彈出畫素周圍是否有沒有生長的畫素
for(k=0;k<8;k++){
//待考察的鄰域點
currentPoint.x=popPoint.x+direction[k][0];
currentPoint.y=popPoint.y+direction[k][1];
//如果待考察的點不在影象內,則跳過
if(currentPoint.x<0||currentPoint.x>m_imgWidth-1||
currentPoint.y<0||currentPoint.y>m_imgHeight-1)
continue;
//該點標號
label=*(m_pImgDataOut+currentPoint.y*lineByte+currentPoint.x);
//彈出的點周圍有尚沒生長的點
if(label==255){
temp2=*(m_pImgData+currentPoint.y*lineByte+currentPoint.x);
//如果當前被考察的畫素灰度值與種子點灰度值之差小於給定的閾值,
//則認為相似,將其進棧處理
if(abs(temp1-temp2)<thresh){
//給該點置生長標記0
*(m_pImgDataOut+currentPoint.y*lineByte+currentPoint.x)=0;
top++;
stack[top].x=currentPoint.x;
stack[top].y=currentPoint.y;
}
}
}
}
delete []stack;
}
(1)為輸出影象申請緩衝區,並初始化白色;
(2)將種子點入棧,並將輸出影象對應位置編輯黑色;
(3)從棧中彈出一個畫素點(該畫素點已在輸出緩衝區標記過),考察該畫素點的8鄰域中有畫素與種子點灰度差小於給定的閥值T,且該點在輸出影象中沒有被標記過,則將該點入棧,並將輸出影象緩衝區對應位置標記成黑色;
(4)重複步驟(3),直至棧空為止。
而我想實現邊界顯示成白線,其他部分不變的結果。請大家幫幫忙……謝謝
//以下是區域生長程式碼
//迴圈變數
int i, j;
//將輸出影象初始化置255,用0代表畫素的生長標記
for(i=0;i<m_imgHeight;i++){
for(j=0;j<m_imgWidth;j++){
*(m_pImgDataOut+i*lineByte+j)=255;
}
}
//二維陣列direction代表中心畫素點8鄰域座標與該點在x和y方向上的偏移,
//其中第一列為x方向的偏移,第二列為y方向的偏移
int direction[8][2]={{0,1},{1,1},{1,0},{1,-1},{0,-1},{-1,-1},{-1,0},
{-1,1}};
//棧申請,此處假定進棧的畫素最多為影象總畫素數
CPoint *stack=new CPoint[m_imgWidth*m_imgHeight];
//棧頂指標
int top;
//當前正處理的點和彈出的點
CPoint currentPoint, popPoint;
//迴圈變數,遍歷array陣列的第一維下標
int k;
//標記變數
int label;
//臨時變數
int temp1, temp2;
//記錄種子畫素的灰度值
temp1=*(m_pImgData+seed.y*lineByte+seed.x);
//將給定種子點置標記0,入棧
*(m_pImgDataOut+seed.y*lineByte+seed.x)=0;
top=0;
stack[top].x=seed.x;
stack[top].y=seed.y;
//堆疊
while(top>-1){
//彈出棧頂元素,該元素已經生長過
popPoint.x=stack[top].x;
popPoint.y=stack[top].y;
top--;
//考察彈出畫素周圍是否有沒有生長的畫素
for(k=0;k<8;k++){
//待考察的鄰域點
currentPoint.x=popPoint.x+direction[k][0];
currentPoint.y=popPoint.y+direction[k][1];
//如果待考察的點不在影象內,則跳過
if(currentPoint.x<0||currentPoint.x>m_imgWidth-1||
currentPoint.y<0||currentPoint.y>m_imgHeight-1)
continue;
//該點標號
label=*(m_pImgDataOut+currentPoint.y*lineByte+currentPoint.x);
//彈出的點周圍有尚沒生長的點
if(label==255){
temp2=*(m_pImgData+currentPoint.y*lineByte+currentPoint.x);
//如果當前被考察的畫素灰度值與種子點灰度值之差小於給定的閾值,
//則認為相似,將其進棧處理
if(abs(temp1-temp2)<thresh){
//給該點置生長標記0
*(m_pImgDataOut+currentPoint.y*lineByte+currentPoint.x)=0;
top++;
stack[top].x=currentPoint.x;
stack[top].y=currentPoint.y;
}
}
}
}
delete []stack;
}