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

Labeling Algorithm

尚未結案
mitao
一般會員


發表:34
回覆:5
積分:7
註冊:2003-08-14

發送簡訊給我
#1 引用回覆 回覆 發表時間:2004-08-11 13:22:10 IP:61.222.xxx.xxx 未訂閱
大家好: 我的目的是要把左圖5個白色部分用不同的顏色表示,也就是做標記... 有參考過站上的程式碼.不過結果卻是右圖 想了很久還是找不出原因,想請教各位先進解決的辦法,謝謝! 程式碼如下
Graphics::TBitmap *OR = new Graphics::TBitmap();
OR->Assign(Image1->Picture->Bitmap);
Byte *ptr;
for(int j=0;jHeight;j++)
 {
  ptr = (Byte *) OR->ScanLine[j];
  for(int i=0;iWidth;i++)
  {  
   if(ptr[i*3]==255)
   {
    label=label+1;
    Connect(OR,label,i,j);
    }
  }
 }
Image2->Picture->Assign(OR);
//-------------------------------------------------------------------
int __fastcall TForm1::Connect(Graphics::TBitmap *bmp,int label,int x,int y)
{
 bmp->Canvas->Pixels[x][y]=label;
 if(bmp->Canvas->Pixels[x+ 1][y] ==255)
  {
    Connect(bmp,label, x + 1, y);
  }
 if(bmp->Canvas->Pixels[x + 1][y - 1] ==255)
  {
    Connect(bmp,label, x + 1, y - 1);
  }
  if(bmp->Canvas->Pixels[x][y - 1] ==255)
  {
    Connect(bmp,label, x , y - 1);
  }
  if(bmp->Canvas->Pixels[x-1][y - 1] ==255)
  {
    Connect(bmp,label, x-1, y - 1);
  }
   if(bmp->Canvas->Pixels[x-1][y] ==255)
  {
    Connect(bmp,label,x-1, y);
  }
  if(bmp->Canvas->Pixels[x - 1][y+1]  ==255)
  {
    Connect(bmp, label,x - 1, y+1);
  }
  if(bmp->Canvas->Pixels[x][y + 1] ==255)
  {
    Connect(bmp,label, x, y + 1);
  }
  if(bmp->Canvas->Pixels[x + 1][y + 1] ==255)
  {
    Connect( bmp,label,x + 1, y + 1);
  }
}
//------------------------------------------------------------------- 
richtop
資深會員


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

發送簡訊給我
#2 引用回覆 回覆 發表時間:2004-08-11 14:27:09 IP:211.76.xxx.xxx 未訂閱
mitao 您好:    感覺上好像只是顏色位址填錯而已? < class="code">Graphics::TBitmap *OR = new Graphics::TBitmap(); OR->Assign(Image1->Picture->Bitmap); OR->PixelFormat = pf24bit; // 先加入此行試試吧! RichTop 敬上 =====***** 把數學當工具,可以解決問題;將數學變能力,能夠發現並解決問題! =====#####
mitao
一般會員


發表:34
回覆:5
積分:7
註冊:2003-08-14

發送簡訊給我
#3 引用回覆 回覆 發表時間:2004-08-11 15:45:51 IP:61.222.xxx.xxx 未訂閱
有試過,但是結果一樣...
richtop
資深會員


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

發送簡訊給我
#4 引用回覆 回覆 發表時間:2004-08-11 17:36:29 IP:211.76.xxx.xxx 未訂閱
mitao 您好:    試著將下列相同敘述, bmp->Canvas->Pixels[x+ 1][y]; 改成 GetRValue( bmp->Canvas->Pixels[x+ 1][y] ) ==255 // 所以填入的顏色,R分量不可以是255。 因為bmp->Canvas->Pixels[x+ 1][y]是傳回TColor,不是單純的int。 GetXValue(.),其中X可以是R、G或B,分別表示取出的RGB分量。 還有先定義一個顏色陣列,ex. myColor,再利用label來選顏色,而不要只填入label (int)
TColor myColor[]={(TColor) RGB(125,  0,  0),
                  (TColor) RGB(254,  0,  0),
                  (TColor) RGB(  0,254,  0),
                  (TColor) RGB(  0,  0,254),
                  (TColor) RGB(254,254,  0),
                  (TColor) RGB(254,  0,254),
                  (TColor) RGB(  0,254,254)  };
bmp->Canvas->Pixels[x][y]=myColor[label]; 另外,搜尋有可能會跑出邊界,也要先判斷是否跑出邊界,再呼叫Connect(.)。
bool checkBoundary(int x, int y)
{ if ( x<0 || x>=Form1->Image1->Width || y<0 || y>=Form1->Image1->Height )
    return false;
  else
    return true;
}    舉例如下:
if ( checkBoundary(x+1, y) ) // 八個方向都要,先判斷再呼叫Connect(.)
  { if (GetRValue(bmp->Canvas->Pixels[x+ 1][y]) ==255)
      {  Connect(bmp,label, x + 1, y);
      }
  }
不好意思!改了又改!< >< > RichTop 敬上 =====***** 把數學當工具,可以解決問題;將數學變能力,能夠發現並解決問題! =====##### 發表人 - richtop 於 2004/08/11 18:53:05 發表人 - richtop 於 2004/08/11 23:43:29
Maxie
一般會員


發表:3
回覆:3
積分:1
註冊:2004-06-10

發送簡訊給我
#5 引用回覆 回覆 發表時間:2004-08-11 17:37:40 IP:140.124.xxx.xxx 未訂閱
   
   if(ptr[i*3]==255)
建議加上另外兩個顏色的條件:
   if(ptr[i*3]==255 && ptr[i*3 1]==255 && ptr[i*3 2]==255)
mitao
一般會員


發表:34
回覆:5
積分:7
註冊:2003-08-14

發送簡訊給我
#6 引用回覆 回覆 發表時間:2004-08-12 11:14:39 IP:61.228.xxx.xxx 未訂閱
多謝各為前輩的答覆! 套用richtop的方法,已成功解決我的問題!
richtop
資深會員


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

發送簡訊給我
#7 引用回覆 回覆 發表時間:2004-08-12 21:38:55 IP:211.76.xxx.xxx 未訂閱
mitao 您好:    這就像在填圖,所以只要判斷上下左右四個方向即可,速度會快些!
moore5221
一般會員


發表:0
回覆:1
積分:0
註冊:2005-09-28

發送簡訊給我
#8 引用回覆 回覆 發表時間:2005-10-25 01:17:18 IP:203.70.xxx.xxx 未訂閱
我想問一下解決此篇文章的大大 這個程式只能用在文章上的圖嗎? 我試了其他的圖,好像都會stack over 這到底是為什麼啊?
系統時間:2024-05-10 11:55:32
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!