鏈碼(八鄰邊點搜尋),請協助程式偵錯!謝謝! |
尚未結案
|
auslk
初階會員 發表:35 回覆:77 積分:32 註冊:2003-02-17 發送簡訊給我 |
親愛的各位先進長輩們,
小弟有一二值化影像,其中我要偵測的影像是不規則的白色物體存在黑色背景中
我使用鏈碼方式,想讓副程式回傳pixels數量(2~9pixels為一個單位)
但現有回傳的數值一直怪怪的,請各為協助偵錯!
//=========主程式===================== for(int y = 0; y < BMP->Height; y++) { ptr = (Byte *) BMP->ScanLine[y]; for(int x = 0; x < BMP->Width; x++) { if(ptr[x * 3] == 255) { cx = Connect(BMP, x, y); break; } } } //=========副程式===================== int Connect(Graphics::TBitmap * BMP, int x, int y) { BMP->Canvas->Pixels[x][y] = clBlue; int c = c + 1; // 判斷 (x+1,y) if(BMP->Canvas->Pixels[x + 1][y] == clWhite) { Connect(BMP, x + 1, y); } // 判斷(x + 1, y - 1) else if(BMP->Canvas->Pixels[x + 1][y - 1] == clWhite) { Connect(BMP, x + 1, y - 1); } // 判斷 (x+1,y+1) else if(BMP->Canvas->Pixels[x + 1][y + 1] == clWhite) { Connect(BMP, x + 1, y + 1); } // 判斷 (x,y-1) else if(BMP->Canvas->Pixels[x][y - 1] == clWhite) { Connect(BMP, x, y - 1); } // 判斷 (x,y-1) else if(BMP->Canvas->Pixels[x][y + 1] == clWhite) { Connect(BMP, x, y + 1); } // 判斷 (x-1,y) else if(BMP->Canvas->Pixels[x - 1][y] == clWhite) { Connect(BMP, x - 1, y); } // 判斷 (x-1,y-1) else if(BMP->Canvas->Pixels[x - 1][y - 1] == clWhite) { Connect(BMP, x - 1, y - 1); } // 判斷 (x+1,y) else if(BMP->Canvas->Pixels[x + 1][y] == clWhite) { Connect(BMP, x + 1, y); } // 判斷 (x-1,y+1) else if(BMP->Canvas->Pixels[x - 1][y + 1] == clWhite) { Connect(BMP, x - 1, y + 1); } else { return (c); } } 以下是我製作的影像,9pixels=>應該會有4個,請協助謝謝! |
JerryKuo
版主 發表:42 回覆:571 積分:322 註冊:2003-03-10 發送簡訊給我 |
|
auslk
初階會員 發表:35 回覆:77 積分:32 註冊:2003-02-17 發送簡訊給我 |
您好! 1.邊界我也有修正過 2.int c=c+1; BCB可以COMIPLER OK
其實我想一想後,就加上int c=0;c=c+1; <~~ 3.謝謝您所提到的程式修改 ,不過還是沒有解決我的問題
請在協助小弟偵錯! 謝謝!
引言: auslk你好: 1.沒有考慮到邊界的情況 2.在副程式的第二行int C = C 1;這樣的寫法好像不對,也沒有達到統計的效果 c在剛進入副程式時,並沒有初值,c = c 1compiler應該不會過才對; 3.最後第二點應該是BMP->Canvas->Pixels[x-1][y] == clWhite,不是[x 1][y]; 檢查一下這幾點看看 ^^ |
taishyang
站務副站長 發表:377 回覆:5490 積分:4563 註冊:2002-10-08 發送簡訊給我 |
您好:
若是要計算物件數量的話請改成下面這樣
int cx=0; //為了編譯可以過 int c = 0; //計算用 Graphics::TBitmap *BMP = new Graphics::TBitmap(); Byte *ptr=NULL; BMP->LoadFromFile("1.bmp"); for(int y = 0; y < BMP->Height; y ) { ptr = (Byte *) BMP->ScanLine[y]; for(int x = 0; x < BMP->Width; x ) { if(ptr[x * 3] == 255) { cx= Connect(BMP, x, y); c ; //累計 //break; } } } ShowMessage(c); //秀出計算結果 delete BMP;順心 |
auslk
初階會員 發表:35 回覆:77 積分:32 註冊:2003-02-17 發送簡訊給我 |
謝謝您ㄉ指導! 我想這題目是這樣的 任意一張影像
很多不規則區塊(白色區塊), @必須要先計算出每一個白色區塊有幾個pixels
因為有雜訊問題,1~2pixels <~雜訊
超過3以上9以下,才算一個 要如何確認像素後,才能算個數 不知道您有否更好的寫法?請指導!謝謝!
引言: 您好: 若是要計算物件數量的話請改成下面這樣int cx=0; //為了編譯可以過 int c = 0; //計算用 Graphics::TBitmap *BMP = new Graphics::TBitmap(); Byte *ptr=NULL; BMP->LoadFromFile("1.bmp"); for(int y = 0; y < BMP->Height; y ) { ptr = (Byte *) BMP->ScanLine[y]; for(int x = 0; x < BMP->Width; x ) { if(ptr[x * 3] == 255) { cx= Connect(BMP, x, y); c ; //累計 //break; } } } ShowMessage(c); //秀出計算結果 delete BMP;順心 >>< face="Verdana, Arial, Helvetica"> |
taishyang
站務副站長 發表:377 回覆:5490 積分:4563 註冊:2002-10-08 發送簡訊給我 |
您好:
引言: 我想這題目是這樣的 任意一張影像很多不規則區塊(白色區塊), @必須要先計算出每一個白色區塊有幾個pixels 因為有雜訊問題,1~2pixels <~雜訊 超過3以上9以下,才算一個 要如何確認像素後,才能算個數 不知道您有否更好的寫法?請指導!謝謝! 1.算討論啦,指導不敢當 要是我的話,會先做侵蝕的動作(將超過> < class="code"> int count=0; int Connect(Graphics::TBitmap * BMP, int x, int y) { count ; BMP->Canvas->Pixels[x][y] = clBlack; // 判斷 (x 1,y) if(BMP->Canvas->Pixels[x 1][y] == clWhite) { Connect(BMP, x 1, y); } // 判斷(x 1, y - 1) if(BMP->Canvas->Pixels[x 1][y - 1] == clWhite) { Connect(BMP, x 1, y - 1); } // 判斷 (x 1,y 1) if(BMP->Canvas->Pixels[x][y - 1] == clWhite) { Connect(BMP, x , y - 1); } // 判斷 (x,y-1) if(BMP->Canvas->Pixels[x-1][y - 1] == clWhite) { Connect(BMP, x-1, y - 1); } // 判斷 (x,y-1) if(BMP->Canvas->Pixels[x-1][y] == clWhite) { Connect(BMP, x-1, y); } // 判斷 (x-1,y) if(BMP->Canvas->Pixels[x - 1][y 1] == clWhite) { Connect(BMP, x - 1, y 1); } // 判斷 (x-1,y-1) if(BMP->Canvas->Pixels[x][y 1] == clWhite) { Connect(BMP, x, y 1); } // 判斷 (x 1,y) if(BMP->Canvas->Pixels[x 1][y 1] == clWhite) { Connect(BMP, x 1, y 1); } // 判斷 (x-1,y 1) if(BMP->Canvas->Pixels[x 1][y] == clWhite) { Connect(BMP, x 1, y); } return (count); } //--------------------------------------------------------------------------- void __fastcall TForm1::Button1Click(TObject *Sender) { int c = 0; Graphics::TBitmap *BMP = new Graphics::TBitmap(); Byte *ptr=NULL; BMP->LoadFromFile("1.bmp"); for(int y = 0; y < BMP->Height; y ) { ptr = (Byte *) BMP->ScanLine[y]; for(int x = 0; x < BMP->Width; x ) { if(ptr[x * 3] == 255) { int cx= Connect(BMP, x, y); Memo1->Lines->Add(cx); 顯示每次計算的結果(物件所佔的像素數) count=0; //歸0用 if (cx>=3 && cx<=9) c =1; //計算物件各數 (可用像素數cx來限制是否累計) //break; } } } ShowMessage(c); delete BMP; } //---------------------------------------------------------------------------順心 <>~我也是在學習的階段,回答的不好請您多多見諒與指教~> 發表人 - |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |