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

四連通問題

尚未結案
jiaching
一般會員


發表:21
回覆:21
積分:8
註冊:2003-07-05

發送簡訊給我
#1 引用回覆 回覆 發表時間:2003-10-13 11:39:29 IP:211.76.xxx.xxx 未訂閱
請問一下~~~ 假設我有一張圖(二值化後) 1.我想要label all 4-connected component 假設這樣稱為一個block 2.並且找出每一個block的中心 而且可以把座標存起來用 該怎麼下手 新手上路 如果表達的不清楚 請多多指教 我的程式碼大概如下 :
Graphics::TBitmap *Bmp = new Graphics::TBitmap();
 Byte *ptr;
 int i,j;
 Bmp->Assign(img1->Picture->Bitmap);
 for(j=1;jHeight-1;j  )
 {
  ptr = (Byte *)Bmp->ScanLine[j];
  for(i=1;iWidth-1;i  )
  {
    if(ptr[i]==0&&ptr[i-1]==0&&ptr[i 1]==0)
     {
     ptr[i*3]=255;
     ptr[i*3 1]=255;
     ptr[i*3 2]=255;
     }
      else
   {
   ptr[i*3]=0;
   ptr[i*3 1]=0;
   ptr[i*3 2]=0;
   }
  }
 }      img2->Picture->Assign(Bmp);
 delete Bmp;
}
其中四連通裡面的 水平部分應該是對的 可是垂直部分 不知道怎麼用 還有把每一個block中心座標存起來 是用TPoint嗎?還是Tcolor? 謝謝~~~~
JerryKuo
版主


發表:42
回覆:571
積分:322
註冊:2003-03-10

發送簡訊給我
#2 引用回覆 回覆 發表時間:2003-10-13 11:56:55 IP:61.230.xxx.xxx 未訂閱
引言: 請問一下~~~ 假設我有一張圖(二值化後) 1.我想要label all 4-connected component 假設這樣稱為一個block 2.並且找出每一個block的中心 而且可以把座標存起來用 該怎麼下手 新手上路 如果表達的不清楚 請多多指教 我的程式碼大概如下 :
Graphics::TBitmap *Bmp = new Graphics::TBitmap();
 Byte *ptr;
 int i,j;
 Bmp->Assign(img1->Picture->Bitmap);
 for(j=1;jHeight-1;j  )
 {
  ptr = (Byte *)Bmp->ScanLine[j];
  for(i=1;iWidth-1;i  )
  {
    if(ptr[i]==0&&ptr[i-1]==0&&ptr[i 1]==0)
     {
     ptr[i*3]=255;
     ptr[i*3 1]=255;
     ptr[i*3 2]=255;
     }
      else
   {
   ptr[i*3]=0;
   ptr[i*3 1]=0;
   ptr[i*3 2]=0;
   }
  }
 }      img2->Picture->Assign(Bmp);
 delete Bmp;
}
其中四連通裡面的 水平部分應該是對的 可是垂直部分 不知道怎麼用 還有把每一個block中心座標存起來 是用TPoint嗎?還是Tcolor? 謝謝~~~~ < face="Verdana, Arial, Helvetica"> 你好: 有些名詞請你先解釋一下,這樣比較好了解你的問題。 1.)label all 4-connected component 是什麼意思?在做什麼的? 2.)那段程式跟四連通又有什麼關聯,麻煩一下囉^^
jiaching
一般會員


發表:21
回覆:21
積分:8
註冊:2003-07-05

發送簡訊給我
#3 引用回覆 回覆 發表時間:2003-10-16 01:40:53 IP:211.76.xxx.xxx 未訂閱
JerryKuo版主你好~~~ 我是看人臉辨識論文來的 裡面有提到label all 4-connected 應該就是在一張二值化的影像裡找到所有四連通的東西 在膚色部分以白色顯示 非膚色部分以黑色顯示(如眼睛鼻子嘴巴) 就是(x,y)那點是黑色 且在(x-1,y) (x 1,y) (x,y-1) (x,y 1)也是黑色 就存起來(應該是存(x,y)這一點) 這樣叫做一個block 然後存起來的這些點 會有一些幾何上的關係 比方說眼睛跟嘴巴(等腰三角形) 我還是初學者 所以程式還在練習當中 所以可能寫錯也不一定 請指點指點~~~
JerryKuo
版主


發表:42
回覆:571
積分:322
註冊:2003-03-10

發送簡訊給我
#4 引用回覆 回覆 發表時間:2003-10-16 14:39:49 IP:61.230.xxx.xxx 未訂閱
引言: JerryKuo版主你好~~~ 我是看人臉辨識論文來的 裡面有提到label all 4-connected 應該就是在一張二值化的影像裡找到所有四連通的東西 在膚色部分以白色顯示 非膚色部分以黑色顯示(如眼睛鼻子嘴巴) 就是(x,y)那點是黑色 且在(x-1,y) (x 1,y) (x,y-1) (x,y 1)也是黑色 就存起來(應該是存(x,y)這一點) 這樣叫做一個block 然後存起來的這些點 會有一些幾何上的關係 比方說眼睛跟嘴巴(等腰三角形) 我還是初學者 所以程式還在練習當中 所以可能寫錯也不一定 請指點指點~~~
你好: 怎麼實作全憑各人感覺和技巧,如果一定要用scanline去讀取資料的話,為了要 做垂直方向的搜尋,每做一個block,用scanline讀取y-1,y,y 1三行資料,從y-1, y和y 1得到你要的像素值,搭配水平方向同時進行比對,這樣的讀取方式,受限於 scanline的特性,不管你要讀取幾個像素,只要不同一個y軸,像素在哪一列,那一 列就要全部讀取,這樣的程式複雜度得到5個像素值,算算這樣很划不來。如果可 以的話建議你考慮將圖片資料用一維陣列或二維陣列存放,這樣你就不用去考慮 垂直方向的scanline 障礙,直接讀取陣列就方便多了... 至於怎麼存放每個block,我能想到的就是用index,每個block給一個標籤,相連 的block 就給同一種標籤,這樣要取出判斷是什麼形狀時,比較方便。
yslin
一般會員


發表:5
回覆:17
積分:4
註冊:2003-11-03

發送簡訊給我
#5 引用回覆 回覆 發表時間:2003-12-11 19:19:44 IP:140.109.xxx.xxx 未訂閱
你好: 建議你看paper時也要看一些影像處理的書,這樣background才夠。 對於你的第一個問題,我建議你看一下儒林出版的數位影像處理,作者:連國珍。page 8-3,有你所要的問題定義和解答。c source code可參考書後的附錄。 你的第二個問題,我想記錄座標和Tpoint等沒較大的關係,而是看你想要知道記錄的是每個block的位置在你form裡的那個絕對或相對位置來記錄吧... 你可以把你的ptr陣列換算成二維的陣列,不就知道這個影像在bitmap的那個座標了嗎?
auslk
初階會員


發表:35
回覆:77
積分:32
註冊:2003-02-17

發送簡訊給我
#6 引用回覆 回覆 發表時間:2003-12-11 23:02:04 IP:219.68.xxx.xxx 未訂閱
您好!     其實我也是想粉久,第一次寫影像處理程式    這程式目的在儲存相關位置的陣列    若有不妥之處,請各位多多協助小弟!     以下~     注意事項:     請先拉出Image1 &Image2  Image2 必須先load 一張相同尺寸的空白影像     建議使用副程式    1.Image 輸入 轉陣列儲存  2.將陣列輸出到Image    
 
// 主程式 
void __fastcall TForm1::GRAY1Click(TObject * Sender)
{
  int x =Image1->Width; 
  int y =Image1->Height;
  int *f = new int[3 * x * y];
  int *g = new int[3 * x * y];
  image_to_array(Image1, f);    // 讀取圖片至陣列      color_to_gray(x, y, f, g); //轉灰階       array_to_image(g, Image2); //輸出到圖片        Image2->Invalidate();         // 更新圖片      delete g;
  delete f;
}    //副程式     void image_to_array(TImage * Image1, int *f)
{
  int x, y;
  int h = Image1->Picture->Height;
  int w = Image1->Picture->Width;
  Byte *ptr;
  for(y = 0; y < h; y  )
  {
    ptr = (Byte *) Image1->Picture->Bitmap->ScanLine[y];        // 取得圖片第 y 
                                                                // 軸的起始位置
    for(x = 0; x < w * 3; x = x   3)
    {
      f[x   3 * w * y] = (int)ptr[x];   // 將圖片的pixel依序填入 陣列
      f[x   1   3 * w * y] = (int)ptr[x   1];
      f[x   2   3 * w * y] = (int)ptr[x   2];        }
  }
}    void array_to_image(int *g, TImage * Image2)
{
  int x, y;
  Byte *ptr;
  int h = Image2->Picture->Height;
  int w = Image2->Picture->Width;
  /*
     Graphics::TBitmap * bmp = new Graphics::TBitmap();
     bmp->Assign(Image1->Picture->Bitmap); bmp->PixelFormat = pf24bit; 
   */
  for(y = 0; y < h; y  )
  {
    ptr = (Byte *) Image2->Picture->Bitmap->ScanLine[y];        // 取得圖片第 y 
                                                                // 軸的起始位置
    for(x = 0; x < w * 3; x = x   3)
    {
      ptr[x   2] = (Byte) g[x   3 * w * y];     // 將陣列的pixel依序填入圖片
      ptr[x   1] = (Byte) g[(x   1)   3 * w * y];
      ptr[x] = (Byte) g[(x   2)   3 * w * y];
    }
  }
}    
< >< >
taishyang
站務副站長


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

發送簡訊給我
#7 引用回覆 回覆 發表時間:2003-12-11 23:10:21 IP:140.135.xxx.xxx 未訂閱
auslk您好:  謝謝您的分享,但似乎跟四連通似乎沒有關係< > > 順心< > <>~我也是在學習的階段,回答的不好請您多多見諒與指教~
auslk
初階會員


發表:35
回覆:77
積分:32
註冊:2003-02-17

發送簡訊給我
#8 引用回覆 回覆 發表時間:2003-12-11 23:32:10 IP:219.68.xxx.xxx 未訂閱
多謝您的協助!     小弟是想分享轉成矩陣處理比較方便  轉成矩陣後  我們可以用以下處理  320*240 舉例:     定義第一塊區塊:  for(j=0;j<160;j ) for(i=0;i<120;i ) 定義第二塊區塊: for(j=160;j<=320;j ) for(i=0;i<120;i ) 定義第三塊區塊: for(j=0;j<160;j ) for(i=120;i<240;i ) 定義第四塊區塊: for(j=160;j<320;j ) for(i=120;i<240;i )
引言: auslk您好: 謝謝您的分享,但似乎跟四連通似乎沒有關係< > > 順心< > <>~我也是在學習的階段,回答的不好請您多多見諒與指教~
系統時間:2024-05-13 2:19:44
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!