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

請問該如何以矩形框出多邊形的最大邊界

尚未結案
akin1107
一般會員


發表:12
回覆:14
積分:5
註冊:2004-07-26

發送簡訊給我
#1 引用回覆 回覆 發表時間:2004-12-04 21:45:48 IP:220.130.xxx.xxx 未訂閱
因為是一張黑白相間的多邊形圖片,且背景也是白色的 因此想裁掉多餘的背景 想利用矩形來框出邊界以做裁剪 不知道該如何去找出這四邊的點座標 我查詢過站上的文章 http://delphi.ktop.com.tw/topic.php?topic_id=58841 但是有點看不太懂,也不知道該如何寫成程式,一定要這麼複雜嗎 我想問問還有其他的方法嗎?
richtop
資深會員


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

發送簡訊給我
#2 引用回覆 回覆 發表時間:2004-12-04 23:25:39 IP:211.76.xxx.xxx 未訂閱
akin1107 您好:    如果只是要找整個框住黑白影像的邊界的話,可以想像由上下左右分別掃瞄影像,當讀到黑點表示碰到邊界,如此就能框出您要的邊界。 要是想找到每個分開區域的外框邊界,當然得再修正了。 程式供參考。    

void findBoundary(TImage *image)
{
  Byte **ptr;
  int r, g, b, gray, index;      image->Picture->Bitmap->PixelFormat = pf24bit;
  ptr = new Byte*[image->Picture->Height];
  for (int k=0; kPicture->Height; k++)
     ptr[k] = (Byte*) image->Picture->Bitmap->ScanLine[k];
  int x[2], y[2];
  // up bound
  bool skip = false;
  for (int row=0; rowPicture->Height; row++)
     { index = 0;
       for (int col=0; colPicture->Width; col++)
          { if ( ptr[row][index]==0 ) // black point meeting
              { y[0] = row;
                skip = true;
                break;
              }
            index += 3;
          }
       if ( skip ) break;
     }
  // bottom bound
  skip = false;   
  for (int row=image->Picture->Height-1; row>=0; row--)
     { index = 0;
       for (int col=0; colPicture->Width; col++)
          { if ( ptr[row][index]==0 ) // black point meeting
              { y[1] = row;
                skip = true;
                break;
              }
            index += 3;
          }
       if ( skip ) break;
     }
  // left bound
  skip = false;
  for (int col=0; colPicture->Width; col++)
     { index = col*3;
       for (int row=0; rowPicture->Height; row++)
          { if ( ptr[row][index]==0 ) // black point meeting
              { x[0] = col;
                skip = true;
                break;
              }
          }
       if ( skip ) break;
     }
  // right bound
  skip = false;
  for (int col=image->Picture->Width-1; col>=0; col--)
     { index = col*3;
       for (int row=0; rowPicture->Height; row++)
          { if ( ptr[row][index]==0 ) // black point meeting
              { x[1] = col;
                skip = true;
                break;
              }
          }
       if ( skip ) break;
     }      image->Picture->Bitmap->Canvas->Pen->Color = clRed;
  image->Picture->Bitmap->Canvas->MoveTo(0,y[0]);
  image->Picture->Bitmap->Canvas->LineTo(image->Picture->Width-1,y[0]);
  image->Picture->Bitmap->Canvas->MoveTo(0,y[1]);
  image->Picture->Bitmap->Canvas->LineTo(image->Picture->Width-1,y[1]);
  image->Picture->Bitmap->Canvas->MoveTo(x[0],0);
  image->Picture->Bitmap->Canvas->LineTo(x[0],image->Picture->Height-1);
  image->Picture->Bitmap->Canvas->MoveTo(x[1],0);
  image->Picture->Bitmap->Canvas->LineTo(x[1],image->Picture->Height-1);      delete [] ptr;
}    void __fastcall TForm1::Button1Click(TObject *Sender)
{
  findBoundary(Image1);
}
 
RichTop 敬上 =====***** 把數學當工具,可以解決問題;將數學變能力,能夠發現並解決問題! =====#####
1666362
初階會員


發表:66
回覆:124
積分:43
註冊:2004-07-07

發送簡訊給我
#3 引用回覆 回覆 發表時間:2004-12-05 11:13:34 IP:210.192.xxx.xxx 未訂閱
richtop大大    bool skip = false;<---可以解釋這是什麼用法嗎?? 看不懂這個的意思  我是新手 多多指教 ^^
richtop
資深會員


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

發送簡訊給我
#4 引用回覆 回覆 發表時間:2004-12-05 12:29:35 IP:211.76.xxx.xxx 未訂閱
To 1666362,    
引言: richtop大大 bool skip = false;<---可以解釋這是什麼用法嗎?? 看不懂這個的意思 因為希望能跳出兩層的廻圈,所以我設了這個skip變數,先設為false,一但碰到邊界後,就設為true,如此就能藉以判斷是否要跳出外部的迴圈。 我是新手 多多指教 ^^ < face="Verdana, Arial, Helvetica"> RichTop 敬上 =====***** 把數學當工具,可以解決問題;將數學變能力,能夠發現並解決問題! =====#####
akin1107
一般會員


發表:12
回覆:14
積分:5
註冊:2004-07-26

發送簡訊給我
#5 引用回覆 回覆 發表時間:2004-12-06 00:43:54 IP:220.130.xxx.xxx 未訂閱
richtop大哥您好      真是謝謝您的幫助,又幫我解決了一個問題   我也是一個新手,   很多問題也是從站上透過別人的問題找到答案的,   真多虧有你們這些熱心的高手   希望小女有天也能像你們一樣解決別人的問題                                                            真的感激不盡喔
richtop
資深會員


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

發送簡訊給我
#6 引用回覆 回覆 發表時間:2004-12-06 09:37:00 IP:211.76.xxx.xxx 未訂閱
akin1107 您好:    先說好底下內容完全是跟您開玩笑,請勿介意! 您應該是想自己也能儘快幫別人解決問題,不過您用了<>小女而不是<>小女子我, 難道您眞的想讓大夥等到<>未來您的女兒來幫助大家解決問題嗎? 這樣會讓大家等很久喔!< > 我也有個女兒。跟您開開玩笑!請別介意! 其實喜歡設計程式的人,女孩子佔的比例似乎不多,所以在站上有這樣的女孩子,的確應該給予更多的鼓勵! 說真的,只要是抱持認真的學習的心態(不分男女),都會得到各方的幫助,正所謂自助人助;還有在接受人家幫助後能飲水思源,會想再去幫助需要幫助的人,就更難能可貴了!< > 讓我們一起繼續努力加油! <>< face="Verdana, Arial, Helvetica">引言: richtop大哥您好 真是謝謝您的幫助,又幫我解決了一個問題 我也是一個新手, 很多問題也是從站上透過別人的問題找到答案的, 真多虧有你們這些熱心的高手 希望小女有天也能像你們一樣解決別人的問題 真的感激不盡喔 < face="Verdana, Arial, Helvetica"> RichTop 敬上 =====***** 把數學當工具,可以解決問題;將數學變能力,能夠發現並解決問題! =====#####
spruce
一般會員


發表:3
回覆:11
積分:2
註冊:2005-11-05

發送簡訊給我
#7 引用回覆 回覆 發表時間:2005-11-07 10:54:19 IP:210.43.xxx.xxx 未訂閱
我试了怎么还是出错呢?哪位做好了,把程序传上来,让小妹学习一下吧!谢谢!!!
系統時間:2024-05-11 0:55:58
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!