rabbit78585
一般會員
發表:11 回覆:22 積分:6 註冊:2006-08-22
發送簡訊給我
|
各位大大~之前有看過討論如何求最大區域與最小區域~小弟想各位
如何把一張圖內所有白色區個別域框出來~個別計算框出來的長跟寬~
|
tgisman
一般會員
發表:0 回覆:2 積分:5 註冊:2005-10-09
發送簡訊給我
|
唔~我想到了一個笨方法....
使用region growing
大致上的方法是...
while (有白點存在)
{
由任一個白點開始作region growing
將找到的範圍標記起來...(例如標記成黃色.....或是用陣列紀錄....)
計算該區域之MBR...(最小包圍矩形...我不懂你的最大最小的意思.....)
}
這樣就可以把白色區塊分別找出來了....
不知道還有沒有其他方法....
原本是想說用分類的方法...不過好像太複雜了點..^^
|
taishyang
站務副站長
發表:377 回覆:5490 積分:4563 註冊:2002-10-08
發送簡訊給我
|
|
rabbit78585
一般會員
發表:11 回覆:22 積分:6 註冊:2006-08-22
發送簡訊給我
|
|
taishyang
站務副站長
發表:377 回覆:5490 積分:4563 註冊:2002-10-08
發送簡訊給我
|
PO出你的CODE吧,否則怎知你的CODE是否正確?
|
rabbit78585
一般會員
發表:11 回覆:22 積分:6 註冊:2006-08-22
發送簡訊給我
|
<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;j Height;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
發送簡訊給我
|
可以考慮使用連通標記...
如果只要對白色的東西畫外框...
個人建議可以套用『膨脹』XD
|
rabbit78585
一般會員
發表:11 回覆:22 積分:6 註冊:2006-08-22
發送簡訊給我
|
<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
發送簡訊給我
|
你知道我PO的連結中程式的原理嗎?
他會在遞回的過程中去把該白色區域填滿...
表示會經過該白色區域的所有XY座標,你可以把座標記錄下來
當該區域遞回結束就可以用記錄的座標中的MinX, MinY, MaxX, MaxY將該區域框出來
繼續找尋下一個白色區域,重複上面的步驟就可以框出每個白色區域
編輯記錄
taishyang 重新編輯於 2007-04-30 10:45:06, 註解 無‧
|
rabbit78585
一般會員
發表:11 回覆:22 積分:6 註冊:2006-08-22
發送簡訊給我
|
恩.....感謝....問題已經解決了.....把已尋找過的白色區域填滿再循找下一個白色區域...
謝謝版主~
|
rabbit78585
一般會員
發表:11 回覆:22 積分:6 註冊:2006-08-22
發送簡訊給我
|
|
taishyang
站務副站長
發表:377 回覆:5490 積分:4563 註冊:2002-10-08
發送簡訊給我
|
|
rabbit78585
一般會員
發表:11 回覆:22 積分:6 註冊:2006-08-22
發送簡訊給我
|
===================引 用 taishyang 文 章===================
你的意思是指現在沒有辦法結案嗎?
恩...要結案不是按"將此問題結案"嗎?
已經好久之前就按結案~但好像都沒效果!
|
taishyang
站務副站長
發表:377 回覆:5490 積分:4563 註冊:2002-10-08
發送簡訊給我
|
[將此問題結案]按鈕的左邊有個ComboBox
指定答題得分者後再按下[將此問題結案]按鈕即可
|
8615114
一般會員
發表:0 回覆:2 積分:0 註冊:2006-10-24
發送簡訊給我
|
請問 taishyang 大大,您所說的遞迴過程填滿白色區域,遞迴結束在尋找新的白色區域;那應該怎麼開始收尋下一個白色區域呢?
您的第一句話『 你知道我PO的連結中程式的原理嗎?』,請問我該如何看到您PO的連結中程式?請賜教~感激不盡!!
===================引 用 taishyang 文 章===================
你知道我PO的連結中程式的原理嗎?
他會在遞回的過程中去把該白色區域填滿...
表示會經過該白色區域的所有XY座標,你可以把座標記錄下來
當該區域遞回結束就可以用記錄的座標中的MinX, MinY, MaxX, MaxY將該區域框出來
繼續找尋下一個白色區域,重複上面的步驟就可以框出每個白色區域
------ 心存感激接收您的賜教...
|
六尾犬
一般會員
發表:0 回覆:9 積分:11 註冊:2006-09-12
發送簡訊給我
|
三樓有po連結,『四連通』是也
===================引 用 8615114 文 章===================
請問 taishyang?大大,您所說的遞迴過程填滿白色區域,遞迴結束在尋找新的白色區域;那應該怎麼開始收尋下一個白色區域呢?
您的第一句話『 你知道我PO的連結中程式的原理嗎?』,請問我該如何看到您PO的連結中程式?請賜教~感激不盡!!
|