Allanx
一般會員
發表:13 回覆:20 積分:6 註冊:2003-10-06
發送簡訊給我
|
如主題:
如果一張Image裡面的圖形是星型ㄉ,然後已經先做完二值化跟找邊界後,現在我想隨便先找一顆邊界的pixel為起始點,然後順時針去紀錄邊緣像素的座標..
如何去codeㄋㄟ? 希望各位能幫小弟解答一下疑惑....感激不盡< >< >
|
taishyang
站務副站長
發表:377 回覆:5490 積分:4563 註冊:2002-10-08
發送簡訊給我
|
Allanx您好: 您的圖片呢? 該不會是讓大家想像吧?< >
您初步測試的程式碼呢? 該不會是讓大家幫您完成吧?< >
由於這問題不是一下子就能解決的,希望您提供更多的資訊 順心
|
Allanx
一般會員
發表:13 回覆:20 積分:6 註冊:2003-10-06
發送簡訊給我
|
對不起...是我的疏忽...
譬如像以上ㄉ圖..
由上往下scan,掃到第一個邊界pixel是255時為第一點並紀錄它的座標,之後順時針沿著邊界去紀錄邊界的座標,一周之後,若有n個邊界pixel就有n個座標。
因為實在是想不到如何下手...所以就沒有初步的測試ㄌ...
希望板主跟各位大大提供一些想法跟意見..
|
Allanx
一般會員
發表:13 回覆:20 積分:6 註冊:2003-10-06
發送簡訊給我
|
|
taishyang
站務副站長
發表:377 回覆:5490 積分:4563 註冊:2002-10-08
發送簡訊給我
|
|
plihui
初階會員
發表:88 回覆:96 積分:41 註冊:2003-07-03
發送簡訊給我
|
http://delphi.ktop.com.tw/topic.php?TOPIC_ID=28396
這段連結怪怪的喔
怎麼會是用region growing的連結?
|
taishyang
站務副站長
發表:377 回覆:5490 積分:4563 註冊:2002-10-08
發送簡訊給我
|
引言:怎麼會是用region growing的連結?
沒錯壓, 從這張圖看來當遞迴結束後,所得到的座標資料就是邊界的座標
>,但要注意的是, > 發表人 -
|
Allanx
一般會員
發表:13 回覆:20 積分:6 註冊:2003-10-06
發送簡訊給我
|
在這個副程式裡:
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
發送簡訊給我
|
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
發送簡訊給我
|
瞭解了板主整ㄍcode後,對於這ㄍ問題的邏輯有比較完整的領悟ㄌ..
那可以解釋一下這兩行的意思跟用法嘛 ...
> >
|
taishyang
站務副站長
發表:377 回覆:5490 積分:4563 註冊:2002-10-08
發送簡訊給我
|
Allanx您好: 引言:
那可以解釋一下這兩行的意思跟用法嘛...
Application->ProcessMessages();
Sleep(50); 您可以試試看加或不加有什麼不一樣壓< >
請多多利用[搜尋]功能< >
|
plihui
初階會員
發表:88 回覆:96 積分:41 註冊:2003-07-03
發送簡訊給我
|
感謝taishyang大大的引導:
我的region growing加上
Form1->DoubleBuffered=true;
就可以使我的二值化圖檔(.bmp)可以讀較大的檔頭... 剛查過Help;
Form1->DoubleBuffered=true;
好像可以使用更大的外部記憶體?!
我這樣說不曉得taishyang大大認為觀念對不對?
|
plihui
初階會員
發表:88 回覆:96 積分:41 註冊:2003-07-03
發送簡訊給我
|
這題不應該用region growing的方式來做吧!?
很奇怪的是:
如果用一個圓的來執行這個程式,
一開始程式會朝單一方向前進,但是
程式進行到某點
會突然從另一個半圓地方產生第二條黃線?
|
plihui
初階會員
發表:88 回覆:96 積分:41 註冊:2003-07-03
發送簡訊給我
|
請試開一個圓圈的圖(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
發送簡訊給我
|
引言:這題不應該用region growing的方式來做吧!? 謝謝plihui的提醒已修正,確認可以[順時針]
您也可以說說您的方法與程式 發表人 -
|
plihui
初階會員
發表:88 回覆:96 積分:41 註冊:2003-07-03
發送簡訊給我
|
修正?
想法跟你大概差不多
難道...是我的stack有問題嗎???
有測過圓圈的圖(邊緣pixel=1)嗎??
我的方法:
一開始程式會朝單一方向前進,但是
程式進行到某點
會突然從另一個半圓地方產生第二條黃線?
->有鬼嗎?
|
taishyang
站務副站長
發表:377 回覆:5490 積分:4563 註冊:2002-10-08
發送簡訊給我
|
引言:
修正?
想法跟你大概差不多
難道...是我的stack有問題嗎???
有測過圓圈的圖(邊緣pixel=1)嗎??
我的方法:
一開始程式會朝單一方向前進,但是
程式進行到某點
會突然從另一個半圓地方產生第二條黃線?
->有鬼嗎? 不曉得您是否用修正過的程式碼去測試原來的圖片?
倘若條件不一樣,那再討論下去似乎沒有交集 P.S: 是我的錯覺嗎? 個人覺得您的態度不是很友善
|
plihui
初階會員
發表:88 回覆:96 積分:41 註冊:2003-07-03
發送簡訊給我
|
我出運了...感謝taishyang大大
的指點(taishyang真是我的良師ㄚ)
前面有點衝動說..是我太心急了說
不過我改的部份是將4連通改為8連通
避免斷點
|
taishyang
站務副站長
發表:377 回覆:5490 積分:4563 註冊:2002-10-08
發送簡訊給我
|
引言:不過我改的部份是將4連通改為8連通避免斷點
不就是我修改過後的方式(程式)? 發表人 -
|
plihui
初階會員
發表:88 回覆:96 積分:41 註冊:2003-07-03
發送簡訊給我
|
呵呵....總算解出來了
出言不遜..請見諒(T_T) 沒想到站長這麼晚還在站上指導大家
原諒我這個新手吧
|