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

請問如果已經二質化完找出影像,如何剔除不要的不規則型

尚未結案
bala0514
一般會員


發表:42
回覆:37
積分:15
註冊:2004-07-26

發送簡訊給我
#1 引用回覆 回覆 發表時間:2005-03-30 00:14:25 IP:220.139.xxx.xxx 未訂閱
我將一張影像,找出適當的閥值後,將一張影像二直化後,如下圖,但是我僅需保留較大的不規則型,下圖紅色指標部分的白色面積,而剔除其他的資訊,其他部分白點,要如何利用程式,將他實現呢?利用面積?還是其他方法來判斷二直化的影像呢? 圖一 ***程式語言真是一門高深的學問***
------
***程式語言真是一門高深的學問***
taishyang
站務副站長


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

發送簡訊給我
#2 引用回覆 回覆 發表時間:2005-03-30 00:32:00 IP:218.168.xxx.xxx 未訂閱
引言:但是我僅需保留較大的不規則型
您好: 由您的需求便知道利用[面積]囉 至於如何求得面積,站上已有相關資料與程式碼供您參考 順心
1666362
初階會員


發表:66
回覆:124
積分:43
註冊:2004-07-07

發送簡訊給我
#3 引用回覆 回覆 發表時間:2005-03-30 04:40:34 IP:210.192.xxx.xxx 未訂閱
可以用兩種方式 1.如版主所說的計算面積 算出面積 設定出面積範圍 不在範圍內的砍除 這種方式由電腦自行判讀 2.二值化完成後 可以用滑鼠 來找 點出你要的區塊 複製到另一Image上面 半自動的方式
KENI_LIN
中階會員


發表:86
回覆:267
積分:90
註冊:2004-05-31

發送簡訊給我
#4 引用回覆 回覆 發表時間:2005-03-30 11:41:11 IP:61.64.xxx.xxx 未訂閱
講簡單一點,就是只做你要的區域做處理就好了;先找出左上和右下座標,即可抓出一個矩形面積;至於怎麼尋找要的面積區域顯示,可以參考以下這個討論區: http://delphi.ktop.com.tw/topic.php?TOPIC_ID=62637 以上方法的前提要先知道你要的座標點位置,如果不知道怎麼找X,Y座標,以下這一個討論區有講到: http://delphi.ktop.com.tw/topic.php?TOPIC_ID=57368    剛剛有想你的問題是不是要"自動"剔除不要的不規則型,如果是會有一點麻煩,因為這個問題將會是屬於"辨識"程式,就要先看看你的原始圖長什麼樣子嘍! 寒窗苦讀十年書;只待今朝狀元時!~~ ︵ / / ︵ ( ∩ ∩ ) ○ ︶ ○
------
Keni Lin
bala0514
一般會員


發表:42
回覆:37
積分:15
註冊:2004-07-26

發送簡訊給我
#5 引用回覆 回覆 發表時間:2005-03-30 13:59:11 IP:61.30.xxx.xxx 未訂閱
各位高手好,我有大約瞭解你們的意思,taishyang所說的面積方法,我有嘗試過,但是僅對一個白色區塊作面積運算,可以得知其白色區塊所有像素,亦即表示區塊面積。但是要如何計算所有的面積區塊,這就有點難倒我了。若上圖全部白色區塊面積能夠算出,就能夠剔除不要的白色區塊面積,保留所需要的區塊大小,這樣問題應該就可以解決了。那要如何利用程式表示呢?以下我有引用1666362 會員所撰寫的求質心與面積方法,可以找尋到一個白色區塊,但要如何對多區塊作運算呢?    
    Graphics::TBitmap *Bmp = new Graphics::TBitmap();
 Byte *ptr;
 int r,g,b;
 int i,j,XX,YY;
 int sum=0,X=0,Y=0;
 Bmp->Assign(Image2->Picture->Bitmap);
 Bmp->PixelFormat=pf24bit;     for (int i=0;iHeight;i   )
   {
    ptr=(Byte*)Bmp->ScanLine[i];
  for (int j=0;jWidth; j   )
    {
     b=ptr[j*3];
     g=ptr[j*3 1];
     r=ptr[j*3 2];        if(r==255 && g==255 && b==255 && iHeight && jWidth)
    {
     sum=sum 1;
     X=X j;
     Y=Y i;
     XX=X/sum;
     YY=Y/sum;
     Form1->Edit2->Text=XX;
     Form1->Edit3->Text=YY;
     Form1->Edit4->Text=sum;
     }
    }
   }
謝謝各位 ***程式語言真是一門高深的學問***
------
***程式語言真是一門高深的學問***
taishyang
站務副站長


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

發送簡訊給我
#6 引用回覆 回覆 發表時間:2005-03-30 14:21:24 IP:210.68.xxx.xxx 未訂閱
您好: 我指的是利用類似下面連結的方式求出每一塊的面積 http://delphi.ktop.com.tw/topic.php?topic_id=54609 順心
bala0514
一般會員


發表:42
回覆:37
積分:15
註冊:2004-07-26

發送簡訊給我
#7 引用回覆 回覆 發表時間:2005-03-30 16:24:43 IP:61.30.xxx.xxx 未訂閱
taishyang,我有試著連結過去~但是裡面所提到的為利用填滿的方式,將白色的區域填滿,而要如何求面積呢?請教一下。謝謝 ***程式語言真是一門高深的學問***
------
***程式語言真是一門高深的學問***
taishyang
站務副站長


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

發送簡訊給我
#8 引用回覆 回覆 發表時間:2005-03-30 18:37:51 IP:210.68.xxx.xxx 未訂閱
引言:將白色的區域填滿,而要如何求面積呢
每當塗上一點累積像素數就 1,該區域塗滿時就知道面積為何
bala0514
一般會員


發表:42
回覆:37
積分:15
註冊:2004-07-26

發送簡訊給我
#9 引用回覆 回覆 發表時間:2005-03-30 21:39:49 IP:61.30.xxx.xxx 未訂閱
taishyang妳好,我有試著你說的方法,還有利用我所PO的程式碼來對一張二直化的影像,來做面積的運算,但僅適用於一個白色區塊的面積,而無法對全部白色區塊來做運算,如我所PO的圖,多白色區塊的面積,要如何一個一個,分別算出他的個別白色區塊面積,而非所有的白色區塊總面積。謝謝。 ***程式語言真是一門高深的學問***
------
***程式語言真是一門高深的學問***
taishyang
站務副站長


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

發送簡訊給我
#10 引用回覆 回覆 發表時間:2005-03-30 22:59:40 IP:61.216.xxx.xxx 未訂閱
引言:但僅適用於一個白色區塊的面積,而無法對全部白色區塊來做運算,如我所PO的圖,多白色區塊的面積,要如何一個一個,分別算出他的個別白色區塊面積,而非所有的白色區塊總面積
請問您是否了解那段程式碼遞迴處理的意義與目的?? 在每次做遞迴的過程當中,都會經過某一塊白色區域的每一個像素點 如此一來每次遞迴完畢後自然可以獲得每一塊白色區域的面積 順心 發表人 -
bala0514
一般會員


發表:42
回覆:37
積分:15
註冊:2004-07-26

發送簡訊給我
#11 引用回覆 回覆 發表時間:2005-03-30 23:35:02 IP:61.222.xxx.xxx 未訂閱
taishyang,我不是很懂,不知是否可以說明白點呢。接觸影像處理,還不是很懂,希望多多指教。可否大約說明呢?每次遞回,不是從影像的最左上端開始掃瞄,一直掃,遇到白色的就累積,而這樣子就計算全部白色區域的面積,而不知可否一塊一塊計算,分別將每一塊的值,用Edit顯示出來,而在過濾不要的或較小面積的白色區塊。謝謝!感激不盡 ***程式語言真是一門高深的學問***
------
***程式語言真是一門高深的學問***
sew
一般會員


發表:2
回覆:54
積分:21
註冊:2003-08-25

發送簡訊給我
#12 引用回覆 回覆 發表時間:2005-03-30 23:52:30 IP:220.136.xxx.xxx 未訂閱
如果你會計算一塊的面積,那你一定會計算很多塊的面積 如果計算面積是一個副程式 那你只是把圖從頭到尾scan一次 當遇到第一塊時,就call計算面積的副程式 且在計算的同時,將算過的pixel做記號(可將其設為黑色) 這樣在計算完第一塊面積時,同時也將第一塊補成黑色 如此就不用擔心會再去scan到計算過的區塊 加油!
------
加油!
taishyang
站務副站長


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

發送簡訊給我
#13 引用回覆 回覆 發表時間:2005-03-31 00:03:57 IP:218.168.xxx.xxx 未訂閱
下面的連結中的程式碼參考看看 http://delphi.ktop.com.tw/topic.php?TOPIC_ID=50190
pwipwi
版主


發表:68
回覆:629
積分:349
註冊:2004-04-08

發送簡訊給我
#14 引用回覆 回覆 發表時間:2005-03-31 00:32:49 IP:211.76.xxx.xxx 未訂閱
引言: taishyang,我不是很懂,不知是否可以說明白點呢。接觸影像處理,還不是很懂,希望多多指教。可否大約說明呢?每次遞回,不是從影像的最左上端開始掃瞄,一直掃,遇到白色的就累積,而這樣子就計算全部白色區域的面積,而不知可否一塊一塊計算,分別將每一塊的值,用Edit顯示出來,而在過濾不要的或較小面積的白色區塊。謝謝!感激不盡 ***程式語言真是一門高深的學問***
可以使用regional growing的方法將不同的區塊上不同的色,然後再用sew版友提的方法就可以得到你要的結果了。
bala0514
一般會員


發表:42
回覆:37
積分:15
註冊:2004-07-26

發送簡訊給我
#15 引用回覆 回覆 發表時間:2005-03-31 15:24:27 IP:61.30.xxx.xxx 未訂閱
謝謝各位的指導與指教,我已經懂了,謝謝taishyang不惜辛苦,替我解答與給我連結,謝謝你們。讓我對影像處理又有更進一步的認識,也謝謝pwipwi與sew替我解答與提供意見。感激不盡。 ***程式語言真是一門高深的學問***
------
***程式語言真是一門高深的學問***
bala0514
一般會員


發表:42
回覆:37
積分:15
註冊:2004-07-26

發送簡訊給我
#16 引用回覆 回覆 發表時間:2005-03-31 18:04:40 IP:61.222.xxx.xxx 未訂閱
不好意思,我又有問題了,若我在影像上如圖一,找到各白色區塊的面積了。分別是,27、59、68、115、47、234、56、959像素,而我想說,去除掉低於959的像素,而在另一張影像顯現出僅有959像素的白色區塊。或者由原圖中,低於959像素的區塊利用紅色填滿,以示區隔,謝謝。程式碼如下(參考taishyang大大)。< >< >
int count=0;
int Connect(Graphics::TBitmap * BMP, int x, int y)
{
  count  ;
  BMP->Canvas->Pixels[x][y] = clBlack;
  // 判斷 (x 1,y)
  if(BMP->Canvas->Pixels[x   1][y] == clWhite)
  {
    Connect(BMP, x   1, y);
  }
  // 判斷(x   1, y - 1)
  if(BMP->Canvas->Pixels[x   1][y - 1] == clWhite)
  {
    Connect(BMP, x   1, y - 1);
  }
  // 判斷 (x 1,y 1)
  if(BMP->Canvas->Pixels[x][y - 1] == clWhite)
  {
    Connect(BMP, x , y - 1);
  }
  // 判斷 (x,y-1)
  if(BMP->Canvas->Pixels[x-1][y - 1] == clWhite)
  {
    Connect(BMP, x-1, y - 1);
  }
  // 判斷 (x,y-1)
   if(BMP->Canvas->Pixels[x-1][y] == clWhite)
  {
    Connect(BMP, x-1, y);
  }
  // 判斷 (x-1,y)
  if(BMP->Canvas->Pixels[x - 1][y 1] == clWhite)
  {
    Connect(BMP, x - 1, y 1);
  }
  // 判斷 (x-1,y-1)
  if(BMP->Canvas->Pixels[x][y   1] == clWhite)
  {
    Connect(BMP, x, y   1);
  }
  // 判斷 (x 1,y)
  if(BMP->Canvas->Pixels[x   1][y 1] == clWhite)
  {
    Connect(BMP, x   1, y 1);
  }
  // 判斷 (x-1,y 1)
  if(BMP->Canvas->Pixels[x   1][y] == clWhite)
  {
    Connect(BMP, x   1, y);
  }
  return (count);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{      int c = 0;
  Graphics::TBitmap *BMP = new Graphics::TBitmap();
  Byte *ptr=NULL;
  BMP->LoadFromFile("1.bmp");
  for(int y = 0; y < BMP->Height; y  )
  {
    ptr = (Byte *) BMP->ScanLine[y];
    for(int x = 0; x < BMP->Width; x  )
    {
      if(ptr[x * 3] == 255)
      {            int cx= Connect(BMP, x, y);
        Memo1->Lines->Add(cx);  顯示每次計算的結果(物件所佔的像素數)
        count=0; //歸0用
        if (cx>=0 && cx<=1000)
           c =1;    //計算物件各數 (可用像素數cx來限制是否累計)
        //break;
      }
    }
  }
  ShowMessage(c);
  delete BMP;
}
謝謝 ***程式語言真是一門高深的學問***
------
***程式語言真是一門高深的學問***
bala0514
一般會員


發表:42
回覆:37
積分:15
註冊:2004-07-26

發送簡訊給我
#17 引用回覆 回覆 發表時間:2005-03-31 18:18:57 IP:61.31.xxx.xxx 未訂閱
不好意思,我又有問題了,若我在影像上如圖一,找到各白色區塊的面積了。分別是,27、59、68、115、47、234、56、959像素,而我想說,去除掉低於959的像素,而在另一張影像顯現出僅有959像素的白色區塊。或者由原圖中,低於959像素的區塊利用紅色填滿,以示區隔,謝謝。程式碼如下(參考taishyang大大)。< >< >
int count=0;
int Connect(Graphics::TBitmap * BMP, int x, int y)
{
  count  ;
  BMP->Canvas->Pixels[x][y] = clBlack;
  // 判斷 (x 1,y)
  if(BMP->Canvas->Pixels[x   1][y] == clWhite)
  {
    Connect(BMP, x   1, y);
  }
  // 判斷(x   1, y - 1)
  if(BMP->Canvas->Pixels[x   1][y - 1] == clWhite)
  {
    Connect(BMP, x   1, y - 1);
  }
  // 判斷 (x 1,y 1)
  if(BMP->Canvas->Pixels[x][y - 1] == clWhite)
  {
    Connect(BMP, x , y - 1);
  }
  // 判斷 (x,y-1)
  if(BMP->Canvas->Pixels[x-1][y - 1] == clWhite)
  {
    Connect(BMP, x-1, y - 1);
  }
  // 判斷 (x,y-1)
   if(BMP->Canvas->Pixels[x-1][y] == clWhite)
  {
    Connect(BMP, x-1, y);
  }
  // 判斷 (x-1,y)
  if(BMP->Canvas->Pixels[x - 1][y 1] == clWhite)
  {
    Connect(BMP, x - 1, y 1);
  }
  // 判斷 (x-1,y-1)
  if(BMP->Canvas->Pixels[x][y   1] == clWhite)
  {
    Connect(BMP, x, y   1);
  }
  // 判斷 (x 1,y)
  if(BMP->Canvas->Pixels[x   1][y 1] == clWhite)
  {
    Connect(BMP, x   1, y 1);
  }
  // 判斷 (x-1,y 1)
  if(BMP->Canvas->Pixels[x   1][y] == clWhite)
  {
    Connect(BMP, x   1, y);
  }
  return (count);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{      int c = 0;
  Graphics::TBitmap *BMP = new Graphics::TBitmap();
  Byte *ptr=NULL;
  BMP->LoadFromFile("1.bmp");
  for(int y = 0; y < BMP->Height; y  )
  {
    ptr = (Byte *) BMP->ScanLine[y];
    for(int x = 0; x < BMP->Width; x  )
    {
      if(ptr[x * 3] == 255)
      {            int cx= Connect(BMP, x, y);
        Memo1->Lines->Add(cx);  顯示每次計算的結果(物件所佔的像素數)
        count=0; //歸0用
        if (cx>=0 && cx<=1000)
           c =1;    //計算物件各數 (可用像素數cx來限制是否累計)
        //break;
      }
    }
  }
  ShowMessage(c);
  delete BMP;
}
謝謝 ***程式語言真是一門高深的學問***
------
***程式語言真是一門高深的學問***
bala0514
一般會員


發表:42
回覆:37
積分:15
註冊:2004-07-26

發送簡訊給我
#18 引用回覆 回覆 發表時間:2005-03-31 18:19:47 IP:61.31.xxx.xxx 未訂閱
不好意思,我又有問題了,若我在影像上如圖一,找到各白色區塊的面積了。分別是,27、59、68、115、47、234、56、959像素,而我想說,去除掉低於959的像素,而在另一張影像顯現出僅有959像素的白色區塊。或者由原圖中,低於959像素的區塊利用紅色填滿,以示區隔,謝謝。程式碼如下(參考taishyang大大),要如何加入判斷呢?是在if (cx>=0 && cx<=1000中加入嗎?要加入些???。謝謝< >< > 圖一
int count=0;
int Connect(Graphics::TBitmap * BMP, int x, int y)
{
  count++;
  BMP->Canvas->Pixels[x][y] = clBlack;
  // 判斷 (x+1,y)
  if(BMP->Canvas->Pixels[x + 1][y] == clWhite)
  {
    Connect(BMP, x + 1, y);
  }
  // 判斷(x + 1, y - 1)
  if(BMP->Canvas->Pixels[x + 1][y - 1] == clWhite)
  {
    Connect(BMP, x + 1, y - 1);
  }
  // 判斷 (x+1,y+1)
  if(BMP->Canvas->Pixels[x][y - 1] == clWhite)
  {
    Connect(BMP, x , y - 1);
  }
  // 判斷 (x,y-1)
  if(BMP->Canvas->Pixels[x-1][y - 1] == clWhite)
  {
    Connect(BMP, x-1, y - 1);
  }
  // 判斷 (x,y-1)
   if(BMP->Canvas->Pixels[x-1][y] == clWhite)
  {
    Connect(BMP, x-1, y);
  }
  // 判斷 (x-1,y)
  if(BMP->Canvas->Pixels[x - 1][y+1] == clWhite)
  {
    Connect(BMP, x - 1, y+1);
  }
  // 判斷 (x-1,y-1)
  if(BMP->Canvas->Pixels[x][y + 1] == clWhite)
  {
    Connect(BMP, x, y + 1);
  }
  // 判斷 (x+1,y)
  if(BMP->Canvas->Pixels[x + 1][y+1] == clWhite)
  {
    Connect(BMP, x + 1, y+1);
  }
  // 判斷 (x-1,y+1)
  if(BMP->Canvas->Pixels[x + 1][y] == clWhite)
  {
    Connect(BMP, x + 1, y);
  }
  return (count);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{      int c = 0;
  Graphics::TBitmap *BMP = new Graphics::TBitmap();
  Byte *ptr=NULL;
  BMP->LoadFromFile("1.bmp");
  for(int y = 0; y < BMP->Height; y++)
  {
    ptr = (Byte *) BMP->ScanLine[y];
    for(int x = 0; x < BMP->Width; x++)
    {
      if(ptr[x * 3] == 255)
      {            int cx= Connect(BMP, x, y);
        Memo1->Lines->Add(cx);  顯示每次計算的結果(物件所佔的像素數)
        count=0; //歸0用
        if (cx>=0 && cx<=1000)
           c+=1;    //計算物件各數 (可用像素數cx來限制是否累計)
        //break;
      }
    }
  }
  ShowMessage(c);
  delete BMP;
}
謝謝 ***程式語言真是一門高深的學問*** 發表人 -
------
***程式語言真是一門高深的學問***
1666362
初階會員


發表:66
回覆:124
積分:43
註冊:2004-07-07

發送簡訊給我
#19 引用回覆 回覆 發表時間:2005-04-02 16:11:43 IP:210.192.xxx.xxx 未訂閱
您要把 不要區塊圖色或者把您要的區塊複製到另一張圖上 您自己可以決定 不會嗎?? 只想要人家幫您解決問題 這種心態很要不得 請不要再洗版面了 上面的連結都有答案了
系統時間:2024-05-12 22:26:38
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!