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

將影像二值化之後無法正確抓取PIXEL的座標問題

尚未結案
iii0628
一般會員


發表:50
回覆:46
積分:19
註冊:2005-04-04

發送簡訊給我
#1 引用回覆 回覆 發表時間:2005-09-26 02:31:52 IP:163.13.xxx.xxx 未訂閱
請問我將影像二值化之後要抓取出現第一點黑色PIXEL的座標跟最後一點黑色PIXEL的座標,然後用框線框起來。    但是卻出現框線框錯位置的情形,我知道是我條件判斷式跟抓取座標那邊有問題,但是一直搞不定,希望有高手可以幫我看看    另一個的問題是如何寫一個條件判斷式來抓取最後一點黑色PIXEL的座標,謝謝  
void __fastcall TForm1::BitBtn1Click(TObject *Sender)
{
  /*載入圖檔及灰階處理*/
  if(OpenPictureDialog1->Execute())
 {
  Image1->Picture->LoadFromFile(OpenPictureDialog1->FileName);
  Image1->Picture->Bitmap->PixelFormat = pf24bit;       Byte *ptr;
   int r,g,b;
   int gray;
   int i,j;       for (j=0; jPicture->Bitmap->Height; j++)
   {
      ptr = (Byte *)Image1->Picture->Bitmap->ScanLine[j];
      for (i=0; iPicture->Bitmap->Width; i++)
      {
         b = ptr[i*3];
         g = ptr[i*3+1];
         r = ptr[i*3+2];
         gray = 0.299*r+0.587*g+0.114*b;
          if (gray>70)
           gray = 255;
          else
           gray = 0;             ptr[i*3  ] = (Byte)gray;
         ptr[i*3+1] = (Byte)gray;
         ptr[i*3+2] = (Byte)gray;
      }
   }
   Image1->Picture->Assign(Image1->Picture->Bitmap);
 }    }
//---------------------------------------------------------------------------
void __fastcall TForm1::BitBtn2Click(TObject *Sender)
{
   //scan第一個黑色pixel的座標及最後一點黑色pixel的座標//
   Byte *ptr_s;
   int r_s,g_s,b_s;
   int i,j;
   int start_x=0,start_y=0;
   Image1->Canvas->Brush->Color=clYellow;  //g設定框線顏色
   Image1->Canvas->Brush->Style=bsClear;   //設定為透明
   for (j=0; jPicture->Bitmap->Height; j++)
   {
      ptr_s = (Byte *)Image1->Picture->Bitmap->ScanLine[j];
      for (i=0; iPicture->Bitmap->Width; i++)
      {
         b_s = ptr_s[i*3];
         g_s = ptr_s[i*3+1];
         r_s = ptr_s[i*3+2];
         int mean=(b_s+g_s+r_s)/3;
          if(mean==0){  //當scan到黑色pixel時紀錄當時的座標
            start_x=i;
            start_y=j;
            i+Image1->Picture->Bitmap->Width; //紀錄座標之後讓i大於判斷式跳出迴圈
            j+Image1->Picture->Bitmap->Height;//紀錄座標之後讓j大於判斷式跳出迴圈
          }
      }       }       Image1->Canvas->Rectangle(start_x,start_y,Image1->Picture->Bitmap->Width,Image1->Picture->Bitmap->Height);
}
這是正確的結果
 
這是我抓取出來的結果 發表人 - iii0628 於 2005/09/26 02:34:42
husser123
一般會員


發表:14
回覆:10
積分:4
註冊:2005-04-17

發送簡訊給我
#2 引用回覆 回覆 發表時間:2005-09-26 10:08:35 IP:202.145.xxx.xxx 未訂閱
iii0628您好: 主要是得到二值化後,Chart的上下左右邊界,至於要怎麼掃 其實差異不大,重點是你的背景要乾淨,chart的上下不要用磁條固定 二值化後會留下黑黑的點,造成程式誤判 最後呢,一張乾淨二值化後的圖,由陣列的上下左右往中心掃 就能得到x1,x2,y1,y2,框起來就是啦! 加油~u can do it!    
iii0628
一般會員


發表:50
回覆:46
積分:19
註冊:2005-04-04

發送簡訊給我
#3 引用回覆 回覆 發表時間:2005-09-26 11:47:04 IP:220.130.xxx.xxx 未訂閱
husser123你好: 我在剛才才發現背景跟磁條都會照成我程式的誤判難怪會框錯。 至於你提供的方法..由一張乾淨二值化後的圖,從陣列的上下左右往中心掃就能得到x1,x2,y1,y2,框起來就是啦。請問陣列的上下左右往中心掃是指用4條SCANLINE下去掃嗎???可以麻煩你說仔細一點嗎???還有我是當抓到一點黑色PIXEL才紀錄他的座標,這樣的話好像就不能像你可以框出這麼漂亮的框線 可以請你再說一下你的做法嗎,謝謝
husser123
一般會員


發表:14
回覆:10
積分:4
註冊:2005-04-17

發送簡訊給我
#4 引用回覆 回覆 發表時間:2005-09-26 13:54:12 IP:202.145.xxx.xxx 未訂閱
iii0628您好: 你可能想的太複雜了,朝簡單的方向思考 你應該會的,只是暫時還沒想到罷了! 下面是找出y1的code,其他的如法炮製囉~    
int center=Image1->Picture->Bitmap->Width/2;  // 從中心點找
   for (j=0; jPicture->Bitmap->Height; j  )
   {
      ptr = (Byte *)Image1->Picture->Bitmap->ScanLine[j];
      if (ptr[center*3]==0) {
         y1=j;j=Image1->Picture->Bitmap->Height;
      }
   }
RedSnow
版主


發表:79
回覆:1322
積分:845
註冊:2003-12-15

發送簡訊給我
#5 引用回覆 回覆 發表時間:2005-09-26 18:10:10 IP:59.115.xxx.xxx 未訂閱
iii0628 您好:    參考一下下列這篇討論文章,及其內的範例: 請問該如何以矩形框出多邊形的最大邊界 http://delphi.ktop.com.tw/topic.php?topic_id=60924 7 天天敲鍵盤 v 時時按滑鼠 8
iii0628
一般會員


發表:50
回覆:46
積分:19
註冊:2005-04-04

發送簡訊給我
#6 引用回覆 回覆 發表時間:2005-10-05 14:45:50 IP:220.130.xxx.xxx 未訂閱
感謝2位前輩幫忙。我現在是完成我要的功能了,但是老闆希望我可以更精確的框出這24個框框。我現在是先框出色板的外框之後在按照邊框的長寬切比例畫出這24個小框框,而我老闆是希望我可以確實的找出這24個色塊之後在框出圖形來,所以請問一下這樣的話該如何下手???    我目前想到的就是將色板轉成只有邊框是黑色其他色塊都是白色,這樣我就有辦法找出24個色塊,所以我將RGB轉Cr跟Cb加入判斷式中,但是轉出來還是不好,請問還有什麼辦法可以用,謝謝。         
int x[2], y[2], x_unit,y_unit;
 void findBoundary(TImage *image)
{
  Byte **ptr;
  int r, g, b, gray, index;      image->Picture->Bitmap->PixelFormat = pf24bit;
  ptr = new Byte*[image->Picture->Height];
  for (int k=0; kPicture->Height; k  )
     ptr[k] = (Byte*) image->Picture->Bitmap->ScanLine[k];      // up bound
  bool skip = false;
  for (int row=0; rowPicture->Height; row  )
     { index = 0;
       for (int col=0; colPicture->Width; col  )
          { if ( ptr[row][index]==0 ) // black point meeting
              { y[0] = row;
                skip = true;
                break;
              }
            index  = 3;
          }
       if ( skip ) break;
     }
  // bottom bound
  skip = false;   
  for (int row=image->Picture->Height-1; row>=0; row--)
     { index = 0;
       for (int col=0; colPicture->Width; col  )
          { if ( ptr[row][index]==0 ) // black point meeting
              { y[1] = row;
                skip = true;
                break;
              }
            index  = 3;
          }
       if ( skip ) break;
     }
  // left bound
  skip = false;
  for (int col=0; colPicture->Width; col  )
     { index = col*3;
       for (int row=0; rowPicture->Height; row  )
          { if ( ptr[row][index]==0 ) // black point meeting
              { x[0] = col;
                skip = true;
                break;
              }
          }
       if ( skip ) break;
     }
  // right bound
  skip = false;
  for (int col=image->Picture->Width-1; col>=0; col--)
     { index = col*3;
       for (int row=0; rowPicture->Height; row  )
          { if ( ptr[row][index]==0 ) // black point meeting
              { x[1] = col;
                skip = true;
                break;
              }
          }
       if ( skip ) break;
     }      image->Picture->Bitmap->Canvas->Pen->Color = clRed;
  image->Picture->Bitmap->Canvas->MoveTo(0,y[0]);
  image->Picture->Bitmap->Canvas->LineTo(image->Picture->Width-1,y[0]);
  image->Picture->Bitmap->Canvas->MoveTo(0,y[1]);
  image->Picture->Bitmap->Canvas->LineTo(image->Picture->Width-1,y[1]);
  image->Picture->Bitmap->Canvas->MoveTo(x[0],0);
  image->Picture->Bitmap->Canvas->LineTo(x[0],image->Picture->Height-1);
  image->Picture->Bitmap->Canvas->MoveTo(x[1],0);
  image->Picture->Bitmap->Canvas->LineTo(x[1],image->Picture->Height-1);      image->Picture->Bitmap->Canvas->Brush->Style=bsClear;
  image->Picture->Bitmap->Canvas->Pen->Color=clYellow;      x_unit=(x[1]-x[0])/12;
  y_unit=(y[1]-y[0])/8;     // ShowMessage("Y[0] = " IntToStr(y[0]) "");
 // ShowMessage("Y[1] = " IntToStr(y[1]) "");
 // ShowMessage("X[0] = " IntToStr(x[0]) "");
 // ShowMessage("X[1] = " IntToStr(x[1]) "");
  delete [] ptr;
}    void __fastcall TForm1::BitBtn1Click(TObject *Sender)
{
 if(OpenPictureDialog1->Execute()){
 Image1->Picture->LoadFromFile(OpenPictureDialog1->FileName);
 Image2->Picture->LoadFromFile(OpenPictureDialog1->FileName);
 Image1->Picture->Bitmap->PixelFormat = pf24bit;
 Image2->Picture->Bitmap->PixelFormat = pf24bit;
   Byte *ptr;
   int r,g,b;
   int gray,Cb,Cr;
   int i,j;       for (j=0; jPicture->Bitmap->Height; j  )
   {
      ptr = (Byte *)Image1->Picture->Bitmap->ScanLine[j];
      for (i=0; iPicture->Bitmap->Width; i  )
      {
         b = ptr[i*3];
         g = ptr[i*3 1];
         r = ptr[i*3 2];
         gray = 0.299*r 0.587*g 0.114*b;
         Cb = - 0.1687*r - 0.3313*g   0.5*b 128;
         Cr = 0.5*r - 0.4187*g - 0.0813*b 128;              if (gray<22/* && Cr>125&&Cr<129&&Cb>127&&Cb<128*/)
           gray = 0;
          else
           gray = 255;             ptr[i*3  ] = (Byte)gray;
         ptr[i*3 1] = (Byte)gray;
         ptr[i*3 2] = (Byte)gray;
      }
   }
   Image1->Picture->Assign(Image1->Picture->Bitmap);
 }     findBoundary(Image1);      Image2->Picture->Bitmap->Canvas->Brush->Style=bsClear;
  Image2->Picture->Bitmap->Canvas->Pen->Color=clYellow;
 //第一列//
  Image2->Picture->Bitmap->Canvas->Rectangle((x[0] x_unit-20),(y[0] y_unit-20),(x[0] x_unit 20),(y[0] y_unit 20));
  Image2->Picture->Bitmap->Canvas->Rectangle((x[0] x_unit*3-20),(y[0] y_unit-20),(x[0] x_unit*3 20),(y[0] y_unit 20));
  Image2->Picture->Bitmap->Canvas->Rectangle((x[0] x_unit*5-20),(y[0] y_unit-20),(x[0] x_unit*5 20),(y[0] y_unit 20));
  Image2->Picture->Bitmap->Canvas->Rectangle((x[0] x_unit*7-20),(y[0] y_unit-20),(x[0] x_unit*7 20),(y[0] y_unit 20));
  Image2->Picture->Bitmap->Canvas->Rectangle((x[0] x_unit*9-20),(y[0] y_unit-20),(x[0] x_unit*9 20),(y[0] y_unit 20));
  Image2->Picture->Bitmap->Canvas->Rectangle((x[0] x_unit*11-20),(y[0] y_unit-20),(x[0] x_unit*11 20),(y[0] y_unit 20));      //第二列//
  Image2->Picture->Bitmap->Canvas->Rectangle((x[0] x_unit-20),(y[0] y_unit*3-20),(x[0] x_unit 20),(y[0] y_unit*3 20));
  Image2->Picture->Bitmap->Canvas->Rectangle((x[0] x_unit*3-20),(y[0] y_unit*3-20),(x[0] x_unit*3 20),(y[0] y_unit*3 20));
  Image2->Picture->Bitmap->Canvas->Rectangle((x[0] x_unit*5-20),(y[0] y_unit*3-20),(x[0] x_unit*5 20),(y[0] y_unit*3 20));
  Image2->Picture->Bitmap->Canvas->Rectangle((x[0] x_unit*7-20),(y[0] y_unit*3-20),(x[0] x_unit*7 20),(y[0] y_unit*3 20));
  Image2->Picture->Bitmap->Canvas->Rectangle((x[0] x_unit*9-20),(y[0] y_unit*3-20),(x[0] x_unit*9 20),(y[0] y_unit*3 20));
  Image2->Picture->Bitmap->Canvas->Rectangle((x[0] x_unit*11-20),(y[0] y_unit*3-20),(x[0] x_unit*11 20),(y[0] y_unit*3 20));      //第三列//
  Image2->Picture->Bitmap->Canvas->Rectangle((x[0] x_unit-20),(y[0] y_unit*5-20),(x[0] x_unit 20),(y[0] y_unit*5 20));
  Image2->Picture->Bitmap->Canvas->Rectangle((x[0] x_unit*3-20),(y[0] y_unit*5-20),(x[0] x_unit*3 20),(y[0] y_unit*5 20));
  Image2->Picture->Bitmap->Canvas->Rectangle((x[0] x_unit*5-20),(y[0] y_unit*5-20),(x[0] x_unit*5 20),(y[0] y_unit*5 20));
  Image2->Picture->Bitmap->Canvas->Rectangle((x[0] x_unit*7-20),(y[0] y_unit*5-20),(x[0] x_unit*7 20),(y[0] y_unit*5 20));
  Image2->Picture->Bitmap->Canvas->Rectangle((x[0] x_unit*9-20),(y[0] y_unit*5-20),(x[0] x_unit*9 20),(y[0] y_unit*5 20));
  Image2->Picture->Bitmap->Canvas->Rectangle((x[0] x_unit*11-20),(y[0] y_unit*5-20),(x[0] x_unit*11 20),(y[0] y_unit*5 20));      //第四列//
  Image2->Picture->Bitmap->Canvas->Rectangle((x[0] x_unit-20),(y[0] y_unit*6.5-20),(x[0] x_unit 20),(y[0] y_unit*6.5 20));
  Image2->Picture->Bitmap->Canvas->Rectangle((x[0] x_unit*3-20),(y[0] y_unit*6.5-20),(x[0] x_unit*3 20),(y[0] y_unit*6.5 20));
  Image2->Picture->Bitmap->Canvas->Rectangle((x[0] x_unit*5-20),(y[0] y_unit*6.5-20),(x[0] x_unit*5 20),(y[0] y_unit*6.5 20));
  Image2->Picture->Bitmap->Canvas->Rectangle((x[0] x_unit*7-20),(y[0] y_unit*6.5-20),(x[0] x_unit*7 20),(y[0] y_unit*6.5 20));
  Image2->Picture->Bitmap->Canvas->Rectangle((x[0] x_unit*9-20),(y[0] y_unit*6.5-20),(x[0] x_unit*9 20),(y[0] y_unit*6.5 20));
  Image2->Picture->Bitmap->Canvas->Rectangle((x[0] x_unit*11-20),(y[0] y_unit*6.5-20),(x[0] x_unit*11 20),(y[0] y_unit*6.5 20));          }     
發表人 - iii0628 於 2005/10/05 14:50:39
系統時間:2024-04-28 0:31:53
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!