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

關於Boundary Follow的問題

尚未結案
Allanx
一般會員


發表:13
回覆:20
積分:6
註冊:2003-10-06

發送簡訊給我
#1 引用回覆 回覆 發表時間:2004-03-11 16:26:30 IP:211.76.xxx.xxx 未訂閱
如主題:     如果一張Image裡面的圖形是星型ㄉ,然後已經先做完二值化跟找邊界後,現在我想隨便先找一顆邊界的pixel為起始點,然後順時針去紀錄邊緣像素的座標.. 如何去codeㄋㄟ?    希望各位能幫小弟解答一下疑惑....感激不盡< >< >
taishyang
站務副站長


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

發送簡訊給我
#2 引用回覆 回覆 發表時間:2004-03-11 16:41:34 IP:140.135.xxx.xxx 未訂閱
Allanx您好:    您的圖片呢? 該不會是讓大家想像吧?< > 您初步測試的程式碼呢? 該不會是讓大家幫您完成吧?< > 由於這問題不是一下子就能解決的,希望您提供更多的資訊 順心
Allanx
一般會員


發表:13
回覆:20
積分:6
註冊:2003-10-06

發送簡訊給我
#3 引用回覆 回覆 發表時間:2004-03-11 18:28:54 IP:211.76.xxx.xxx 未訂閱
對不起...是我的疏忽... 譬如像以上ㄉ圖.. 由上往下scan,掃到第一個邊界pixel是255時為第一點並紀錄它的座標,之後順時針沿著邊界去紀錄邊界的座標,一周之後,若有n個邊界pixel就有n個座標。 因為實在是想不到如何下手...所以就沒有初步的測試ㄌ... 希望板主跟各位大大提供一些想法跟意見..
Allanx
一般會員


發表:13
回覆:20
積分:6
註冊:2003-10-06

發送簡訊給我
#4 引用回覆 回覆 發表時間:2004-03-11 18:34:54 IP:211.76.xxx.xxx 未訂閱
taishyang
站務副站長


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

發送簡訊給我
#5 引用回覆 回覆 發表時間:2004-03-11 18:53:54 IP:140.135.xxx.xxx 未訂閱
Allanx您好: 假如您的星型圖片是沒有斷點的話,您可以參考下面連結 http://delphi.ktop.com.tw/topic.php?TOPIC_ID=28396 swindler前輩的方式 順心
plihui
初階會員


發表:88
回覆:96
積分:41
註冊:2003-07-03

發送簡訊給我
#6 引用回覆 回覆 發表時間:2004-03-12 14:10:34 IP:140.126.xxx.xxx 未訂閱
http://delphi.ktop.com.tw/topic.php?TOPIC_ID=28396 這段連結怪怪的喔 怎麼會是用region growing的連結?
taishyang
站務副站長


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

發送簡訊給我
#7 引用回覆 回覆 發表時間:2004-03-12 14:44:04 IP:140.135.xxx.xxx 未訂閱
引言:怎麼會是用region growing的連結?
沒錯壓, 從這張圖看來當遞迴結束後,所得到的座標資料就是邊界的座標 >,但要注意的是, > 發表人 -
Allanx
一般會員


發表:13
回覆:20
積分:6
註冊:2003-10-06

發送簡訊給我
#8 引用回覆 回覆 發表時間:2004-03-12 19:51:10 IP:211.76.xxx.xxx 未訂閱
在這個副程式裡:      void search(int **img,int i,int j,int H,int W, int num)          {          img[i][j]=num;               //左上方              if (InRange(i-1,j-1,H,W))                 {                 if (img[i-1][j-1]==-1)                 search(img,i-1,j-1,H,W,num);                 }        < > > 感謝回應....< >
taishyang
站務副站長


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

發送簡訊給我
#9 引用回覆 回覆 發表時間:2004-03-12 22:18:59 IP:140.135.xxx.xxx 未訂閱
Allanx您好: 試試下面的code
    void __fastcall TForm1::Button1Click(TObject *Sender)
{
 Graphics::TBitmap* BMP = new Graphics::TBitmap();
 BMP->Assign(Image1->Picture->Bitmap);     Byte* ptr=NULL;
 for (int y=1;yHeight-1 ;y  )
 {
   ptr=(Byte*)BMP->ScanLine[y];
   for (int x=1;xWidth-1 ;x  )
   {
     if (ptr[x*3]==255)
     {
       ComConnect(BMP,x,y);
       Application->ProcessMessages();
       Sleep(50);
     }
   }
 }     Image2->Picture->Assign(BMP);
 delete BMP;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::ComConnect(Graphics::TBitmap* BMP,int x,int y)
{
  BMP->Canvas->Pixels[x][y]=clBlack;
  Memo1->Lines->Add("x:" IntToStr(x) " y:" IntToStr(y));
  Image3->Canvas->Pixels[x][y]=clYellow;      if(BMP->Canvas->Pixels[x 1][y]==clWhite)
    ComConnect(BMP,x 1,y);      if(BMP->Canvas->Pixels[x][y 1]==clWhite)
    ComConnect(BMP,x,y 1);      if(BMP->Canvas->Pixels[x-1][y]==clWhite)
    ComConnect(BMP,x-1,y);      if(BMP->Canvas->Pixels[x][y-1]==clWhite)
    ComConnect(BMP,x,y-1);
}    //---------------------------------------------------------------------------
void __fastcall TForm1::FormCreate(TObject *Sender)
{
  Form1->DoubleBuffered=true;
}
順心 <>~我也是在學習的階段,回答的不好請您多多見諒與指教~
Allanx
一般會員


發表:13
回覆:20
積分:6
註冊:2003-10-06

發送簡訊給我
#10 引用回覆 回覆 發表時間:2004-03-13 00:10:38 IP:211.76.xxx.xxx 未訂閱
瞭解了板主整ㄍcode後,對於這ㄍ問題的邏輯有比較完整的領悟ㄌ.. 那可以解釋一下這兩行的意思跟用法嘛... > >
taishyang
站務副站長


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

發送簡訊給我
#11 引用回覆 回覆 發表時間:2004-03-13 00:20:43 IP:140.135.xxx.xxx 未訂閱
Allanx您好:
引言: 那可以解釋一下這兩行的意思跟用法嘛... Application->ProcessMessages(); Sleep(50);
您可以試試看加或不加有什麼不一樣壓< > 請多多利用[搜尋]功能< >
plihui
初階會員


發表:88
回覆:96
積分:41
註冊:2003-07-03

發送簡訊給我
#12 引用回覆 回覆 發表時間:2004-03-13 10:07:47 IP:61.230.xxx.xxx 未訂閱
感謝taishyang大大的引導: 我的region growing加上 Form1->DoubleBuffered=true; 就可以使我的二值化圖檔(.bmp)可以讀較大的檔頭... 剛查過Help; Form1->DoubleBuffered=true; 好像可以使用更大的外部記憶體?! 我這樣說不曉得taishyang大大認為觀念對不對?
plihui
初階會員


發表:88
回覆:96
積分:41
註冊:2003-07-03

發送簡訊給我
#13 引用回覆 回覆 發表時間:2004-03-15 23:13:22 IP:140.126.xxx.xxx 未訂閱
這題不應該用region growing的方式來做吧!? 很奇怪的是: 如果用一個圓的來執行這個程式, 一開始程式會朝單一方向前進,但是 程式進行到某點 會突然從另一個半圓地方產生第二條黃線?
plihui
初階會員


發表:88
回覆:96
積分:41
註冊:2003-07-03

發送簡訊給我
#14 引用回覆 回覆 發表時間:2004-03-15 23:48:28 IP:140.126.xxx.xxx 未訂閱
請試開一個圓圈的圖(pixel=1) 按照taishyang的寫法: 只會從某一點開始,從該點往兩方延申 而不會單純依順時針跑喔 我的bug code如下: 但是跑到一半就會有我剛剛所說的問題
void __fastcall TForm1::Button1Click(TObject *Sender)
{
 Graphics::TBitmap* BMP = new Graphics::TBitmap();
 BMP->Assign(Image1->Picture->Bitmap);     Byte* ptr=NULL;
 for (int y=1;yHeight-1 ;y  )
 {
   ptr=(Byte*)BMP->ScanLine[y];
   for (int x=1;xWidth-1 ;x  )
   {
     if (ptr[x*3]==255)
     {
       ComConnect(BMP,x,y);
       Application->ProcessMessages();
       Sleep(50);
       break;//找到starting point->跳離迴圈
     }
   }
 }     Image2->Picture->Assign(BMP);
 delete BMP;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::ComConnect(Graphics::TBitmap* BMP,int x,int y)
{
  BMP->Canvas->Pixels[x][y]=clBlack;
  Memo1->Lines->Add("x:" IntToStr(x) " y:" IntToStr(y));
  Image3->Canvas->Pixels[x][y]=clYellow;      if(BMP->Canvas->Pixels[x 1][y]==clWhite)
    ComConnect(BMP,x 1,y);      if(BMP->Canvas->Pixels[x][y 1]==clWhite)
    ComConnect(BMP,x,y 1);      if(BMP->Canvas->Pixels[x-1][y]==clWhite)
    ComConnect(BMP,x-1,y);      if(BMP->Canvas->Pixels[x][y-1]==clWhite)
    ComConnect(BMP,x,y-1);
}    //---------------------------------------------------------------------------
void __fastcall TForm1::FormCreate(TObject *Sender)
{
  Form1->DoubleBuffered=true;
}
taishyang
站務副站長


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

發送簡訊給我
#15 引用回覆 回覆 發表時間:2004-03-15 23:49:41 IP:140.135.xxx.xxx 未訂閱
引言:這題不應該用region growing的方式來做吧!?
謝謝plihui的提醒已修正,確認可以[順時針] 您也可以說說您的方法與程式 發表人 -
plihui
初階會員


發表:88
回覆:96
積分:41
註冊:2003-07-03

發送簡訊給我
#16 引用回覆 回覆 發表時間:2004-03-16 00:32:52 IP:140.126.xxx.xxx 未訂閱
修正? 想法跟你大概差不多 難道...是我的stack有問題嗎??? 有測過圓圈的圖(邊緣pixel=1)嗎?? 我的方法: 一開始程式會朝單一方向前進,但是 程式進行到某點 會突然從另一個半圓地方產生第二條黃線? ->有鬼嗎?
taishyang
站務副站長


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

發送簡訊給我
#17 引用回覆 回覆 發表時間:2004-03-16 00:42:50 IP:140.135.xxx.xxx 未訂閱
引言: 修正? 想法跟你大概差不多 難道...是我的stack有問題嗎??? 有測過圓圈的圖(邊緣pixel=1)嗎?? 我的方法: 一開始程式會朝單一方向前進,但是 程式進行到某點 會突然從另一個半圓地方產生第二條黃線? ->有鬼嗎?
不曉得您是否用修正過的程式碼去測試原來的圖片? 倘若條件不一樣,那再討論下去似乎沒有交集 P.S: 是我的錯覺嗎? 個人覺得您的態度不是很友善
plihui
初階會員


發表:88
回覆:96
積分:41
註冊:2003-07-03

發送簡訊給我
#18 引用回覆 回覆 發表時間:2004-03-16 01:09:31 IP:140.126.xxx.xxx 未訂閱
我出運了...感謝taishyang大大 的指點(taishyang真是我的良師ㄚ) 前面有點衝動說..是我太心急了說 不過我改的部份是將4連通改為8連通 避免斷點
taishyang
站務副站長


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

發送簡訊給我
#19 引用回覆 回覆 發表時間:2004-03-16 01:14:19 IP:140.135.xxx.xxx 未訂閱
引言:不過我改的部份是將4連通改為8連通避免斷點
不就是我修改過後的方式(程式)? 發表人 -
plihui
初階會員


發表:88
回覆:96
積分:41
註冊:2003-07-03

發送簡訊給我
#20 引用回覆 回覆 發表時間:2004-03-16 01:39:33 IP:140.126.xxx.xxx 未訂閱
呵呵....總算解出來了 出言不遜..請見諒(T_T) 沒想到站長這麼晚還在站上指導大家 原諒我這個新手吧
系統時間:2024-05-13 17:09:42
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!