全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:2135
推到 Plurk!
推到 Facebook!

請問這個影像處理的範例是何用途與其意義?

尚未結案
keikojason
初階會員


發表:37
回覆:63
積分:45
註冊:2004-05-10

發送簡訊給我
#1 引用回覆 回覆 發表時間:2004-10-11 15:52:25 IP:163.28.xxx.xxx 未訂閱
各位前輩你們好~~這是小弟在討論區找到的小程式...這是要尋找連續區塊--不過小弟對這程式不了解只知道副程式對每一個去塊,上,下,左,右,左上,左下,右上,右下,那它是怎樣判斷的,那主程式每一行要怎樣解釋呢? 是否有前輩能為小弟說明一下每一個區段程式是做什麼用的,小弟會細心聆聽...謝謝前輩....    ================================================================
   
   int cx=0;  
   int c = 0; 
   Graphics::TBitmap *BMP = new Graphics::TBitmap();
   Byte *ptr=NULL;
   BMP->Assign(Image1->Picture->Bitmap );
   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  ;              }
      }
   }
   Edit8->Text=IntToStr(c);      
   delete BMP;     }
//-------------------------------------------------------------------    int __fastcall TForm1::Connect(Graphics::TBitmap * BMP, int x, int y)
{
int count=0;      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);    }、、、
sew
一般會員


發表:2
回覆:54
積分:21
註冊:2003-08-25

發送簡訊給我
#2 引用回覆 回覆 發表時間:2004-10-11 18:24:04 IP:140.124.xxx.xxx 未訂閱
一般來說,要抓相同的一區塊可用四相鄰與八相鄰的方法 以一個九宮格的mask來說,標示如下 1 2 3 4 5 6 7 8 9 以5為中心且採用四相鄰來說,以5的灰階值為準且設定一個門檻值(threshold)如加減10的灰階值 只要2 4 6 8四格中有符合門檻值則其與中心5為相鄰 則可判定為同一區塊 以八相鄰來說,則是取 1 2 3 4 6 7 8 9八格來計算 找到一個相鄰點時,再將中心移到該點再做四相鄰或八相鄰 當全部做完時,則可找出區塊的位置,所佔面積等 加油!
------
加油!
keikojason
初階會員


發表:37
回覆:63
積分:45
註冊:2004-05-10

發送簡訊給我
#3 引用回覆 回覆 發表時間:2004-10-12 16:10:43 IP:163.28.xxx.xxx 未訂閱
小弟再請問在這程式上它是怎樣執行的,我對這程式的來龍去脈不是很知道,不知道那位前輩可以為我解釋說明或加一些註解,每一個行程式是做什麼用(如他怎樣呼叫副程式,或是程式為什麼要這樣宣告的..等等)..小弟先謝謝前輩----
sew
一般會員


發表:2
回覆:54
積分:21
註冊:2003-08-25

發送簡訊給我
#4 引用回覆 回覆 發表時間:2004-10-13 00:48:51 IP:218.161.xxx.xxx 未訂閱
上述的程式碼是利用遞迴方式,先將圖形載入 BMP->Assign(Image1->Picture->Bitmap ); 再利用二個FOR迴圈來一個個掃描圖形 ptr = (Byte *) BMP->ScanLine[y];擷取PIXEL值到ptr中 若其中有一個值為255(白色),就進行八相鄰的檢查 找出連續的區塊 呼叫connect就是要找連續區塊 而connect中再呼叫connect就是以遞迴方法來處理尋找連續區塊 原理如前篇所回 加油!
------
加油!
taishyang
站務副站長


發表:377
回覆:5490
積分:4563
註冊:2002-10-08

發送簡訊給我
#5 引用回覆 回覆 發表時間:2004-10-13 23:45:30 IP:220.139.xxx.xxx 未訂閱
keikojason您好: 您可以參考下面連結的程式與說明 http://delphi.ktop.com.tw/topic.php?TOPIC_ID=56347 順心
keikojason
初階會員


發表:37
回覆:63
積分:45
註冊:2004-05-10

發送簡訊給我
#6 引用回覆 回覆 發表時間:2004-10-17 12:16:13 IP:218.169.xxx.xxx 未訂閱
引言: keikojason您好: 您可以參考下面連結的程式與說明 http://delphi.ktop.com.tw/topic.php?TOPIC_ID=56347 順心 < face="Verdana, Arial, Helvetica"> 小弟愚笨< >還是不是很了解呢?...小弟算是新手不知道要怎樣撰寫因為對於一些程式用法不是很清楚,那要找出最大區塊並取出其最大與最小的座標值,那要怎樣去處裡呢?請前輩指教~~~謝謝< >
系統時間:2024-05-21 2:53:39
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!