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

請問這個細化圖形的路徑判斷......

答題得分者是:justdo
xdio2
一般會員


發表:60
回覆:29
積分:17
註冊:2004-07-23

發送簡訊給我
#1 引用回覆 回覆 發表時間:2004-11-11 01:20:17 IP:61.59.xxx.xxx 未訂閱
小弟對幾個數字跟字母做了路徑判斷 主要是判別終點,跟四方向點(以自己為中心其他八方向中有四個都為黑色) ,以及三方向點    但是好像除了終點的判斷正確,其他都出現錯誤... 以下是我的結果 到底四方向跟三方向的部分是哪裡出錯呢? 小弟附上了程式碼,請各位大大幫幫忙解惑 感謝~
int p1[1000][1000];
void p1Pixel(Graphics::TBitmap *pBmp)
{    Byte *ptr;
for (int i=0;iHeight;i++ )
 {
  ptr=(Byte*)pBmp->ScanLine[i];
  for (int j=0;jWidth; j++ )
  {
   p1[i][j]=ptr[j*3];
  }
 }    }    //判斷終點的規則是 : 以自己這個黑點為中心, 八個方向內只有一個黑點
int endp(Graphics::TBitmap *epBmp)
{
int endpoint=0;    for(int i=1;iHeight-1;i++ )
 {
  for (int j=1;jWidth-1; j++ )
   {
      if(epBmp->Canvas->Pixels[j][i]==clBlack)
      {
      int p[10]={0};
      p[1]=p1[i-1][j-1];
      p[2]=p1[i][j-1];
      p[3]=p1[i+1][j-1];
      p[4]=p1[i-1][j];
      p[5]=p1[i][j];
      p[6]=p1[i+1][j];
      p[7]=p1[i-1][j+1];
      p[8]=p1[i][j+1];
      p[9]=p1[i+1][j+1];          int bp=0;           for(int pi=1;pi<10;pi++)
       {
        if((p[pi]==0) && (pi!=5))
         bp++;
       }          if(bp==1)
      endpoint++;
    }       }
  }      return(endpoint);    }    //判斷三方向點的規則是 : 以自己這個黑點為中心,八方向內出現三個黑點即可
int threndp(Graphics::TBitmap *threpBmp)
{
int threndpoint=0;    for(int i=1;iHeight-1;i++ )
 {
  for (int j=1;jWidth-1; j++ )
   {
      if(threpBmp->Canvas->Pixels[j][i]==clBlack)
      {
      int p[10]={0};
      p[1]=p1[i-1][j-1];
      p[2]=p1[i][j-1];
      p[3]=p1[i+1][j-1];
      p[4]=p1[i-1][j];
      p[5]=p1[i][j];
      p[6]=p1[i+1][j];
      p[7]=p1[i-1][j+1];
      p[8]=p1[i][j+1];
      p[9]=p1[i+1][j+1];          int bp=0;           for(int pi=1;pi<10;pi++)
       {
        if((p[pi]==0) && (pi!=5))
         bp++;
       }          if(bp==3)
      threndpoint++;         }
   }
  }      return(threndpoint);    }    //判斷四方向點的規則是 : 以自己這個黑點為中心,八方向內出現四個黑點即可
int fouendp(Graphics::TBitmap *fouepBmp)
{
int fouendpoint=0;    for(int i=1;iHeight-1;i++ )
 {
  for (int j=1;jWidth-1; j++ )
   {
      if(fouepBmp->Canvas->Pixels[j][i]==clBlack)
      {
      int p[10]={0};
      p[1]=p1[i-1][j-1];
      p[2]=p1[i][j-1];
      p[3]=p1[i+1][j-1];
      p[4]=p1[i-1][j];
      p[5]=p1[i][j];
      p[6]=p1[i+1][j];
      p[7]=p1[i-1][j+1];
      p[8]=p1[i][j+1];
      p[9]=p1[i+1][j+1];          int bp=0;           for(int pi=1;pi<10;pi++)
       {
        if((p[pi]==0) && (pi!=5))
         bp++;
       }          if(bp==4)
      fouendpoint++;         }
   }
  }      return(fouendpoint);    }    //下面就是啟動判斷各種點的按鈕,處理的圖形都是二值化且細化過的圖檔
void __fastcall TForm1::BitBtn2Click(TObject *Sender)
{
 //下面這個只是小弟在表單上的配置
 TImage *img[6];
 img[0]=Form1->Image3;
 img[1]=Form1->Image4;
 img[2]=Form1->Image5;
 img[3]=Form1->Image6;
 img[4]=Form1->Image7;
 img[5]=Form1->Image8;     TEdit *edt[6];
 edt[0]=Form1->Edit16;
 edt[1]=Form1->Edit19;
 edt[2]=Form1->Edit22;
 edt[3]=Form1->Edit25;
 edt[4]=Form1->Edit28;
 edt[5]=Form1->Edit31;     TEdit *thredt[6];
 thredt[0]=Form1->Edit17;
 thredt[1]=Form1->Edit20;
 thredt[2]=Form1->Edit23;
 thredt[3]=Form1->Edit26;
 thredt[4]=Form1->Edit29;
 thredt[5]=Form1->Edit32;     TEdit *fouedt[6];
 fouedt[0]=Form1->Edit18;
 fouedt[1]=Form1->Edit21;
 fouedt[2]=Form1->Edit24;
 fouedt[3]=Form1->Edit27;
 fouedt[4]=Form1->Edit30;
 fouedt[5]=Form1->Edit33;    //我一次測六張細化路徑
for(int t=0;t<6;t++)
{
Graphics::TBitmap *Bmp = new Graphics::TBitmap();
Bmp->Assign(img[t]->Picture->Bitmap);
p1Pixel(Bmp);    int ep=endp(Bmp);
int threp=threndp(Bmp);
int fouep=fouendp(Bmp);    edt[t]->Text=(IntToStr)(ep);
thredt[t]->Text=(IntToStr)(threp);
fouedt[t]->Text=(IntToStr)(fouep);    delete Bmp;
}    }     
justdo
高階會員


發表:2
回覆:359
積分:222
註冊:2004-08-17

發送簡訊給我
#2 引用回覆 回覆 發表時間:2004-11-11 19:56:22 IP:221.169.xxx.xxx 未訂閱
初步看起來程式並沒有問題,問題在於你的法則 舉例來說(0代表白點、1代表黑點) 110 0x0 010 這樣在x點周遭就有3個黑點,會被你計數到 3 way point,事實上卻不是你要的 011 0x0 110 這樣在x點的周遭就有4個黑點,會被你計數到 4 way point,事實上卻不是你要的
xdio2
一般會員


發表:60
回覆:29
積分:17
註冊:2004-07-23

發送簡訊給我
#3 引用回覆 回覆 發表時間:2004-11-11 20:25:38 IP:61.59.xxx.xxx 未訂閱
引言: 初步看起來程式並沒有問題,問題在於你的法則 舉例來說(0代表白點、1代表黑點) 110 0x0 010 這樣在x點周遭就有3個黑點,會被你計數到 3 way point,事實上卻不是你要的 011 0x0 110 這樣在x點的周遭就有4個黑點,會被你計數到 4 way point,事實上卻不是你要的
那這樣的話...小弟該如何繼續用這個方式來判斷呢? 是要對細化的字體做整理嗎? 大大可否提供辦法呢? 感謝喔~
richtop
資深會員


發表:122
回覆:646
積分:468
註冊:2003-06-10

發送簡訊給我
#4 引用回覆 回覆 發表時間:2004-11-11 20:45:35 IP:211.76.xxx.xxx 未訂閱
xdio2 您好: 一個方法提供參考: 通常會繞著該pixel的8-neighbors一圈,判斷有多少次0=>1或1=>0,藉以判斷相鄰其他點與此點的連接狀況。至於當兩個或更多點相鄰時,要算成幾個分支,就需要您自行定義。 RichTop 敬上 =====***** 把數學當工具,可以解決問題;將數學變能力,能夠發現並解決問題! =====#####
xdio2
一般會員


發表:60
回覆:29
積分:17
註冊:2004-07-23

發送簡訊給我
#5 引用回覆 回覆 發表時間:2004-11-11 20:58:21 IP:61.59.xxx.xxx 未訂閱
引言: xdio2 您好: 一個方法提供參考: 通常會繞著該pixel的8-neighbors一圈,判斷有多少次0=>1或1=>0,藉以判斷相鄰其他點與此點的連接狀況。至於當兩個或更多點相鄰時,要算成幾個分支,就需要您自行定義。 RichTop 敬上 =====***** 把數學當工具,可以解決問題;將數學變能力,能夠發現並解決問題! =====#####
rich大大感謝您的意見喔 多次受您幫助,在此感謝您 我會好好思考您給的靈感 再次感謝喔~
系統時間:2024-05-17 14:15:54
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!