Connected Component Labeling 轉non-cursive |
尚未結案
|
revenger
一般會員 發表:1 回覆:3 積分:0 註冊:2005-05-08 發送簡訊給我 |
hi:
以下是我Connected Component Labeling
一張640*480的圖
int Origin[480][640]; //原始的圖轉成 int 存放此 int Temp[480][640]; //temp buffer TARGET target1[256],object[256]; typedef struct { int id; //TARGET 的計算編號 int cx,cy; //中心點 int area; //面積 }TARGET; void mani() { //count 是傳回計算所得 components 數量 count = mark_components( object, &object_count ); } void mark_components_fill( TARGET *p, int x, int y, int c, int mark ) { //x,y, 要在 screen 內 if( (x)>=0 && (x)< W && y>=0 && y此程式在VC 驗證過沒有問題; 但重點是我目前要移植到一個stack很小的裝置上,大概只能5k bytes左右, 由於Connected Component Labeling我是以recursive撰寫,stack量會很大, 目前想轉寫成non-recursive,這方面不是很瞭解,想請教各位前輩,是否給我一些意見,如何轉成non-recursive的寫法. 請不另賜教,謝謝 發表人 - revenger 於 2005/05/10 15:00:23 發表人 - revenger 於 2005/05/10 17:07:20 |
taishyang
站務副站長 發表:377 回覆:5490 積分:4563 註冊:2002-10-08 發送簡訊給我 |
|
justdo
高階會員 發表:2 回覆:359 積分:222 註冊:2004-08-17 發送簡訊給我 |
查一下Digital Image Processing的書籍應該都有,我簡單描述一下:
由左而右,由上而下一一檢查每個pixel
假若有物體存在,則給予編號,編號方式:
|
revenger
一般會員 發表:1 回覆:3 積分:0 註冊:2005-05-08 發送簡訊給我 |
謝謝justdo的回應:
我的作法跟您說的一樣,而我的影像是經過而二值化的,所以背景是黑的,物體為亮點,但重點是,我本來的方法是recursive,使得stack很大
那麼我改成以while迴圈來作,可以不增加stack嗎?
一個簡單的例子,偵測右邊的CCL
增測到亮點,juge=1.
while(juge) { temp[x][y]=mark; if(temp[x][y 1]==pixel_on; { y=y 1: continue; } }這樣做,是不是可以避免stack增加,請不吝賜教,謝謝. 發表人 - revenger 於 2005/05/10 21:50:51 發表人 - revenger 於 2005/05/10 21:51:40 |
justdo
高階會員 發表:2 回覆:359 積分:222 註冊:2004-08-17 發送簡訊給我 |
|
revenger
一般會員 發表:1 回覆:3 積分:0 註冊:2005-05-08 發送簡訊給我 |
hi:
我看過您之前的文章,裡面有這一段
int __fastcall TForm1::Connect(Graphics::TBitmap * BMP, int x, int y) { int count=0; count ; BMP->Canvas->Pixels[x][y] = clBlack; map[y][x]=id; // 判斷 (x 1,y) if(BMP->Canvas->Pixels[x 1][y] == clWhite) { count =Connect(BMP, x 1, y); } // 判斷 (x 1, y-1) if(BMP->Canvas->Pixels[x 1][y - 1] == clWhite) { count =Connect(BMP, x 1, y - 1); } // 判斷 (x,y-1) if(BMP->Canvas->Pixels[x][y - 1] == clWhite) { count =Connect(BMP, x , y - 1); } // 判斷 (x-1,y-1) if(BMP->Canvas->Pixels[x-1][y - 1] == clWhite) { count =Connect(BMP, x-1, y - 1); } // 判斷 (x-1,y) if(BMP->Canvas->Pixels[x-1][y] == clWhite) { count =Connect(BMP, x-1, y); } // 判斷 (x-1,y 1) if(BMP->Canvas->Pixels[x-1][y 1] == clWhite) { count =Connect(BMP, x-1, y 1); } // 判斷 (x,y 1) if(BMP->Canvas->Pixels[x][y 1] == clWhite) { count =Connect(BMP, x, y 1); } // 判斷 (x 1,y 1) if(BMP->Canvas->Pixels[x 1][y 1] == clWhite) { count =Connect(BMP, x 1, y 1); } return count; }在判斷式成立後,呼叫程式本身,這算是遞迴嗎?若我觀念有錯,請指教. 另外您說我的方法是不足的,是指我本來的程式還是指後來提的簡單方法呢? 請不吝賜教,謝謝 發表人 - revenger 於 2005/05/11 21:43:44 |
justdo
高階會員 發表:2 回覆:359 積分:222 註冊:2004-08-17 發送簡訊給我 |
|
revenger
一般會員 發表:1 回覆:3 積分:0 註冊:2005-05-08 發送簡訊給我 |
hi:
我目前嘗試以這樣的方法來解決,如下:
只修改 mark_components_fill
void mark_components_fill( TARGET *p, int x, int y, int c, int mark ) { while(1) { if( (x)>=0 && (x)< W && y>=0 && y |
justdo
高階會員 發表:2 回覆:359 積分:222 註冊:2004-08-17 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |