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

請問如合找出每個白色區塊

答題得分者是:taishyang
rabbit78585
一般會員


發表:11
回覆:22
積分:6
註冊:2006-08-22

發送簡訊給我
#1 引用回覆 回覆 發表時間:2007-04-27 18:02:49 IP:163.23.xxx.xxx 訂閱




各位大大~之前有看過討論如何求最大區域與最小區域~小弟想各位
如何把一張圖內所有白色區個別域框出來~個別計算框出來的長跟寬~
tgisman
一般會員


發表:0
回覆:2
積分:5
註冊:2005-10-09

發送簡訊給我
#2 引用回覆 回覆 發表時間:2007-04-27 18:16:52 IP:140.116.xxx.xxx 訂閱
唔~我想到了一個笨方法....
使用region growing
大致上的方法是...

while (有白點存在)
{
由任一個白點開始作region growing
將找到的範圍標記起來...(例如標記成黃色.....或是用陣列紀錄....)
計算該區域之MBR...(最小包圍矩形...我不懂你的最大最小的意思.....)
}


這樣就可以把白色區塊分別找出來了....

不知道還有沒有其他方法....
原本是想說用分類的方法...不過好像太複雜了點..^^
taishyang
站務副站長


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

發送簡訊給我
#3 引用回覆 回覆 發表時間:2007-04-27 18:20:02 IP:122.124.xxx.xxx 未訂閱
rabbit78585
一般會員


發表:11
回覆:22
積分:6
註冊:2006-08-22

發送簡訊給我
#4 引用回覆 回覆 發表時間:2007-04-27 18:33:26 IP:163.23.xxx.xxx 訂閱

===================引 用 taishyang 文 章===================
可參考
http://delphi.ktop.com.tw/board.php?cid=168&fid=912&tid=56347

這篇我有參考過...但寫出來!標記到白色最下面!無法網上標記~

taishyang
站務副站長


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

發送簡訊給我
#5 引用回覆 回覆 發表時間:2007-04-27 18:37:05 IP:122.124.xxx.xxx 未訂閱
PO出你的CODE吧,否則怎知你的CODE是否正確?
rabbit78585
一般會員


發表:11
回覆:22
積分:6
註冊:2006-08-22

發送簡訊給我
#6 引用回覆 回覆 發表時間:2007-04-27 19:06:01 IP:163.23.xxx.xxx 訂閱
<textarea class="cpp" rows="10" cols="60" name="code"> void __fastcall TForm1::Button11Click(TObject *Sender) { Memo2->Clear(); Byte *ptr = NULL; int i,j; Graphics::TBitmap *TempBitmap,*OrgBitmap; TempBitmap = Image1->Picture->Bitmap; TempBitmap->PixelFormat = pf24bit;// (TPixelFormat)6;//pf8bit; Image1->Canvas->Brush->Style = bsClear; Image1->Canvas->Pen->Color = clAqua; for(j=0;jHeight;j ) { ptr = (Byte *)TempBitmap->ScanLine[j]; //這裡的用意是在搜尋第一個白點 for(i=0;iWidth;i ) { if (ptr[i*3] == 255) { CCL(TempBitmap, i, j); } } } } //--------------------------------------------------------------------------- void __fastcall TForm1::CCL(Graphics::TBitmap *TempBitmap, int i, int j) { //在原圖上將白點設為黑點,表示此點已經走過 SetPixel(TempBitmap->Canvas->Handle, i, j, clBlack); //在Image1上對應的位置塗上藍點 Image1->Canvas->Pixels[i][j] = clBlue; //在Memo2秀出(X,Y)位置 Memo2->Lines->Add("X:" IntToStr(i) " Y: " IntToStr(j)); Application->ProcessMessages(); if (TempBitmap->Canvas->Pixels[i 1][j]==clWhite) //向右走 CCL(TempBitmap, i 1, j); if (TempBitmap->Canvas->Pixels[i][j 1]==clWhite) //向下走 CCL(TempBitmap, i, j 1); if (TempBitmap->Canvas->Pixels[i-1][j]==clWhite) //向左走 CCL(TempBitmap, i-1, j); if (TempBitmap->Canvas->Pixels[i][j-1]==clWhite) //向上走 CCL(TempBitmap, i, j-1); }</textarea>
===================引 用 taishyang 文 章===================
PO出你的CODE吧,否則怎知你的CODE是否正確? 網上標記會把圖全部填滿~沒辦法只框出白色區域
六尾犬
一般會員


發表:0
回覆:9
積分:11
註冊:2006-09-12

發送簡訊給我
#7 引用回覆 回覆 發表時間:2007-04-28 00:29:54 IP:218.172.xxx.xxx 訂閱
可以考慮使用連通標記...

如果只要對白色的東西畫外框...

個人建議可以套用『膨脹』XD
rabbit78585
一般會員


發表:11
回覆:22
積分:6
註冊:2006-08-22

發送簡訊給我
#8 引用回覆 回覆 發表時間:2007-04-28 14:18:51 IP:163.23.xxx.xxx 訂閱
<textarea class="cpp" rows="10" cols="60" name="code">#include #include #include "tccolor.h" #pragma hdrstop #include "math.h" #include "Unit1.h" //--------------------------------------------------------------------------- #pragma package(smart_init) #pragma resource "*.dfm" TForm1 *Form1; int id=1; int XX,YY; int min(int a, int b) { return (ab) ? a : b; } //--------------------------------------------------------------------------- __fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner) { } //--------------------------------------------------------------------------- void __fastcall TForm1::FormCreate(TObject *Sender) { Image2->Canvas->Brush->Color = clBlack; Image2->Canvas->FillRect(TRect(0,0,Image2->Width,Image2->Height)); Image3->Canvas->Brush->Color = clBlack; Image3->Canvas->FillRect(TRect(0,0,Image3->Width,Image3->Height)); } //--------------------------------------------------------------------------- int __fastcall TForm1::Connect(Graphics::TBitmap * BMP, int x, int y) { int count=0; count ; BMP->Canvas->Pixels[x][y] = clBlack; map[y][x]=id; // 判斷 (x 1,y) if(BMP->Canvas->Pixels[x 1][y] == clWhite) { count =Connect(BMP, x 1, y); } // 判斷 (x 1, y-1) if(BMP->Canvas->Pixels[x 1][y - 1] == clWhite) { count =Connect(BMP, x 1, y - 1); } // 判斷 (x,y-1) if(BMP->Canvas->Pixels[x][y - 1] == clWhite) { count =Connect(BMP, x , y - 1); } // 判斷 (x-1,y-1) if(BMP->Canvas->Pixels[x-1][y - 1] == clWhite) { count =Connect(BMP, x-1, y - 1); } // 判斷 (x-1,y) if(BMP->Canvas->Pixels[x-1][y] == clWhite) { count =Connect(BMP, x-1, y); } // 判斷 (x-1,y 1) if(BMP->Canvas->Pixels[x-1][y 1] == clWhite) { count =Connect(BMP, x-1, y 1); } // 判斷 (x,y 1) if(BMP->Canvas->Pixels[x][y 1] == clWhite) { count =Connect(BMP, x, y 1); } // 判斷 (x 1,y 1) if(BMP->Canvas->Pixels[x 1][y 1] == clWhite) { count =Connect(BMP, x 1, y 1); } return count; } //--------------------------------------------------------------------------- void __fastcall TForm1::Button1Click(TObject *Sender) { id=1; unsigned int counts=0; unsigned int maxcounts=0; unsigned int maxid=0; Graphics::TBitmap *BMP = new Graphics::TBitmap(); BMP->Assign(Image1->Picture->Bitmap ); Byte *ptr=NULL; BMP->PixelFormat = pf8bit; int width=BMP->Width; int height=BMP->Height; map=new unsigned int*[height]; for (int i=0; iScanLine[y]; for(int x = 0; x < width; x ) { if(ptr[x] == 255) { counts= Connect(BMP, x, y); if (counts > maxcounts) { maxcounts=counts; maxid=id; } id ; } } } delete BMP; //ShowMessage(AnsiString("最大區塊為:") maxid ", 大小=" maxcounts); int maxx=0, maxy=0, minx=width-1, miny=height-1; for (int y=0; y taishyang
站務副站長


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

發送簡訊給我
#9 引用回覆 回覆 發表時間:2007-04-30 10:02:40 IP:122.124.xxx.xxx 未訂閱
你知道我PO的連結中程式的原理嗎?
他會在遞回的過程中去把該白色區域填滿...
表示會經過該白色區域的所有XY座標,你可以把座標記錄下來
當該區域遞回結束就可以用記錄的座標中的MinX, MinY, MaxX, MaxY將該區域框出來
繼續找尋下一個白色區域,重複上面的步驟就可以框出每個白色區域
編輯記錄
taishyang 重新編輯於 2007-04-30 10:45:06, 註解 無‧
rabbit78585
一般會員


發表:11
回覆:22
積分:6
註冊:2006-08-22

發送簡訊給我
#10 引用回覆 回覆 發表時間:2007-04-30 11:16:31 IP:163.23.xxx.xxx 訂閱
恩.....感謝....問題已經解決了.....把已尋找過的白色區域填滿再循找下一個白色區域...

謝謝版主~
rabbit78585
一般會員


發表:11
回覆:22
積分:6
註冊:2006-08-22

發送簡訊給我
#11 引用回覆 回覆 發表時間:2007-05-05 20:09:56 IP:61.62.xxx.xxx 訂閱
板大~我之前已經案結案~可是不知道為什麼不行
taishyang
站務副站長


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

發送簡訊給我
#12 引用回覆 回覆 發表時間:2007-05-07 09:48:29 IP:122.124.xxx.xxx 未訂閱
你的意思是指現在沒有辦法結案嗎?
rabbit78585
一般會員


發表:11
回覆:22
積分:6
註冊:2006-08-22

發送簡訊給我
#13 引用回覆 回覆 發表時間:2007-05-07 13:23:03 IP:163.23.xxx.xxx 訂閱

===================引 用 taishyang 文 章===================
你的意思是指現在沒有辦法結案嗎?

恩...要結案不是按"將此問題結案"嗎?
已經好久之前就按結案~但好像都沒效果!
taishyang
站務副站長


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

發送簡訊給我
#14 引用回覆 回覆 發表時間:2007-05-07 13:45:37 IP:122.124.xxx.xxx 未訂閱
[將此問題結案]按鈕的左邊有個ComboBox
指定答題得分者後再按下[將此問題結案]按鈕即可
8615114
一般會員


發表:0
回覆:2
積分:0
註冊:2006-10-24

發送簡訊給我
#15 引用回覆 回覆 發表時間:2007-05-25 17:02:50 IP:140.124.xxx.xxx 訂閱
請問taishyang 大大,您所說的遞迴過程填滿白色區域,遞迴結束在尋找新的白色區域;那應該怎麼開始收尋下一個白色區域呢?
您的第一句話『你知道我PO的連結中程式的原理嗎?』,請問我該如何看到您PO的連結中程式?請賜教~感激不盡!!
===================引 用 taishyang 文 章===================
你知道我PO的連結中程式的原理嗎?
他會在遞回的過程中去把該白色區域填滿...
表示會經過該白色區域的所有XY座標,你可以把座標記錄下來
當該區域遞回結束就可以用記錄的座標中的MinX, MinY, MaxX, MaxY將該區域框出來
繼續找尋下一個白色區域,重複上面的步驟就可以框出每個白色區域
------
心存感激接收您的賜教...
六尾犬
一般會員


發表:0
回覆:9
積分:11
註冊:2006-09-12

發送簡訊給我
#16 引用回覆 回覆 發表時間:2007-05-28 11:05:38 IP:210.70.xxx.xxx 訂閱
三樓有po連結,『四連通』是也

===================引 用 8615114 文 章===================
請問taishyang?大大,您所說的遞迴過程填滿白色區域,遞迴結束在尋找新的白色區域;那應該怎麼開始收尋下一個白色區域呢?
您的第一句話『你知道我PO的連結中程式的原理嗎?』,請問我該如何看到您PO的連結中程式?請賜教~感激不盡!!
系統時間:2024-11-25 2:02:42
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!