線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:2468
推到 Plurk!
推到 Facebook!

鏈碼(八鄰邊點搜尋),請協助程式偵錯!謝謝!

尚未結案
auslk
初階會員


發表:35
回覆:77
積分:32
註冊:2003-02-17

發送簡訊給我
#1 引用回覆 回覆 發表時間:2004-05-16 15:20:23 IP:61.62.xxx.xxx 未訂閱
親愛的各位先進長輩們, 小弟有一二值化影像,其中我要偵測的影像是不規則的白色物體存在黑色背景中 我使用鏈碼方式,想讓副程式回傳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

發送簡訊給我
#2 引用回覆 回覆 發表時間:2004-05-17 10:00:56 IP:61.230.xxx.xxx 未訂閱
auslk你好: 1.沒有考慮到邊界的情況 2.在副程式的第二行int C = C 1;這樣的寫法好像不對,也沒有達到統計的效果 c在剛進入副程式時,並沒有初值,c = c 1compiler應該不會過才對; 3.最後第二點應該是BMP->Canvas->Pixels[x-1][y] == clWhite,不是[x 1][y]; 檢查一下這幾點看看 ^^
auslk
初階會員


發表:35
回覆:77
積分:32
註冊:2003-02-17

發送簡訊給我
#3 引用回覆 回覆 發表時間:2004-05-18 21:32:14 IP:61.62.xxx.xxx 未訂閱
您好!     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

發送簡訊給我
#4 引用回覆 回覆 發表時間:2004-05-18 22:33:49 IP:140.135.xxx.xxx 未訂閱
您好: 若是要計算物件數量的話請改成下面這樣
   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

發送簡訊給我
#5 引用回覆 回覆 發表時間:2004-05-18 23:15:53 IP:219.68.xxx.xxx 未訂閱
謝謝您ㄉ指導!    我想這題目是這樣的    任意一張影像 很多不規則區塊(白色區塊),    @必須要先計算出每一個白色區塊有幾個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

發送簡訊給我
#6 引用回覆 回覆 發表時間:2004-05-18 23:34:12 IP:140.135.xxx.xxx 未訂閱
您好:
引言: 我想這題目是這樣的 任意一張影像很多不規則區塊(白色區塊), @必須要先計算出每一個白色區塊有幾個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;
}
//---------------------------------------------------------------------------
順心 <>~我也是在學習的階段,回答的不好請您多多見諒與指教~ 發表人 -
系統時間:2024-05-12 20:14:24
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!