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

怎麼將圖中(640*480)白色的部分用程式把它框出來呢???

尚未結案
小慶
一般會員


發表:45
回覆:31
積分:15
註冊:2004-09-29

發送簡訊給我
#1 引用回覆 回覆 發表時間:2004-10-27 11:25:16 IP:61.221.xxx.xxx 未訂閱
各位前輩.....小弟我有一個問題... 就是有一張已經二質化完的圖 然後怎麼用程式把它框出來......... 然後框出來以後........ 將框出來後的高分成三等份(1:3:3)並把它畫線...... 我的圖如下: ...謝謝各位前輩...... ...正在努力學習中的小弟......
暗黑破壞神
版主


發表:9
回覆:2301
積分:1627
註冊:2004-10-04

發送簡訊給我
#2 引用回覆 回覆 發表時間:2004-10-27 11:42:20 IP:203.69.xxx.xxx 未訂閱
可以給一下。你的程式跑出來想要”像什麼”嗎? 原始圖是這樣。那目標勒? 只說1:3:3又要幹什麼呢? 對不起喔。我們書讀得不多。不知道一些專有名詞的說法。 麻煩白話些或是給原始及目標。這樣才好協助你。^_^
小慶
一般會員


發表:45
回覆:31
積分:15
註冊:2004-09-29

發送簡訊給我
#3 引用回覆 回覆 發表時間:2004-10-27 12:12:21 IP:61.221.xxx.xxx 未訂閱
不好意思.......各位前輩...... 我從覆一下我的問題...... 就是有一張圖....亮的點(pixel=255)暗的點(pixel=0) 如下圖.......我想把亮的點即白色區域用程式將它框出來 然後將框出來的框的高度分成三等份(1:3:3)並畫線.....如下圖... 謝謝前輩們的指導... 正在努力學習中的小弟.........
暗黑破壞神
版主


發表:9
回覆:2301
積分:1627
註冊:2004-10-04

發送簡訊給我
#4 引用回覆 回覆 發表時間:2004-10-27 13:52:13 IP:203.69.xxx.xxx 未訂閱
都會那麼複雜的轉圖了。。。。。 這個算是簡單的吧。 設幾個變數 minX, maxX, minY, maxY. 然後去掃一下這個圖。 你就可以找到X的左跟右邊界。以及Y的最上跟最上邊界。 然後用Y去把它分三等分。 這樣不就算解出來了嗎?
小慶
一般會員


發表:45
回覆:31
積分:15
註冊:2004-09-29

發送簡訊給我
#5 引用回覆 回覆 發表時間:2004-10-27 14:12:24 IP:61.221.xxx.xxx 未訂閱
前輩你好...... 因為我是程式初學者....... 我的程式不知道哪裡出錯了.......一直沒辦法run所以...... 可否請前輩把程式po出來讓我參考....... 謝謝... 正在努力學習中的小弟....
暗黑破壞神
版主


發表:9
回覆:2301
積分:1627
註冊:2004-10-04

發送簡訊給我
#6 引用回覆 回覆 發表時間:2004-10-27 14:44:13 IP:203.69.xxx.xxx 未訂閱
~_! 應該是你把不能動的程式PO出來吧。 不是要我寫給你吧。
小慶
一般會員


發表:45
回覆:31
積分:15
註冊:2004-09-29

發送簡訊給我
#7 引用回覆 回覆 發表時間:2004-10-27 20:33:20 IP:61.221.xxx.xxx 未訂閱
前輩.......感謝你的回答... 現在我的圖變成這樣...如下... 程式也如下.... 要畫白色物體的下方線.....不知道怎麼寫 而且我只想框白色物體..... ....另外...前輩我不知道怎麼把框駐物體的4個點標示出來 圖:     程式:
void __fastcall TForm1::Button1Click(TObject *Sender)
{
  Graphics::TBitmap *TheBitmap, *TempBitmap;
  TempBitmap = new Graphics::TBitmap;
  TempBitmap->Assign(Image1->Picture->Bitmap);
  TempBitmap->PixelFormat = pf8bit;
  Byte *ptr;
  int w,h,i,j;
  w=Image1->Width;
  h=Image1->Height;
  int n=0,line=-1;
  int mark=w;
  for (i=0; iScanLine[i];
     line = -1;
     for (j=0; j=255)
              {
                line=j;
                break;
              }
       }
       if ( line!=-1 && mark>line )
         {
           mark=line;
           //break;
         }
     }      //if (line != -1)
    {
      Edit1->Text=line;
      Image1->Canvas->Pen->Color=clGreen;
      Image1->Canvas->Pen->Width=1;
      Image1->Canvas->Pen->Style=psSolid;
      Image1->Canvas->MoveTo(mark,0);
      Image1->Canvas->LineTo(mark,h);
    }
  mark=0;
  for (i=0; iScanLine[i];
       line = -1;
       for (j=w-1; j>=0; j--)
          {
          if (ptr[j]>=255)
              {
                line=j;
                break;
              }
          }           if ( line!=-1 && markText=line;
      Image1->Canvas->Pen->Color=clGreen;
      Image1->Canvas->Pen->Width=1;
      Image1->Canvas->Pen->Style=psSolid;
      Image1->Canvas->MoveTo(mark,0);
      Image1->Canvas->LineTo(mark,h);
    }
  delete TempBitmap;
}
//---------------------------------------------------------------------------    void __fastcall TForm1::Button2Click(TObject *Sender)
{
Graphics::TBitmap *TheBitmap, *TempBitmap;
TempBitmap = new Graphics::TBitmap();
TempBitmap =Image1->Picture->Bitmap;
TempBitmap->PixelFormat = pf8bit;
Byte *ptr1;
int w,h,i,j;
 w=Image1->Width;
 h=Image1->Height;
 unsigned short int piexl[640][480];
 int n=0,line;
 for(int j=0;jScanLine[j];
    for(int i=0;i0)
         {
         line=j;
         break;
         }
         else
         {
         n=0;
         }
 }
         Edit1->Text=n;
         Edit2->Text=line;
         Image1->Canvas->Pen->Color=clGreen;
         Image1->Canvas->Pen->Width=1;
         Image1->Canvas->Pen->Style=psSolid;
         Image1->Canvas->MoveTo(0,line);
         Image1->Canvas->LineTo(640,line);
}
謝謝前輩的指導...
暗黑破壞神
版主


發表:9
回覆:2301
積分:1627
註冊:2004-10-04

發送簡訊給我
#8 引用回覆 回覆 發表時間:2004-10-27 21:15:29 IP:203.69.xxx.xxx 未訂閱
你會用 ScanLine 這個東西,那你就會判斷它的內容是不是白色啊。 對不對? 這樣你就可以像我說的找出它在那一行那一點開始是白色。 這不就是答案了嗎????? 怪怪。。。。難道你的程式是抄來的?
暗黑破壞神
版主


發表:9
回覆:2301
積分:1627
註冊:2004-10-04

發送簡訊給我
#9 引用回覆 回覆 發表時間:2004-10-27 21:37:21 IP:203.69.xxx.xxx 未訂閱
int minX=w;
int maxX=0;
int minY=h;
int maxY=0;
for(int i=0;iScanLine[i];
for(int j=0;j j)
minX = j;
if (j > maxX)
maxX = j;
if (minY > i)
minY = i;
if (maxY < i)
maxY = i;
}
}
再來就是用 linto 這種東西。由
(minX, minY)  -> (maxX, minY)
(minX, minY) -> (minX, maxY)
(maxX, minY) -> (maxX, maxY)
(minX, maxY) -> (maxX, maxY) 畫起來就是你要的四方框了啊。    
程式未實際跑過。可能你還要TRY一下。
小慶
一般會員


發表:45
回覆:31
積分:15
註冊:2004-09-29

發送簡訊給我
#10 引用回覆 回覆 發表時間:2004-10-27 22:09:33 IP:61.221.xxx.xxx 未訂閱
謝謝前輩的指導........ 我的程式是自己寫的......只是有些觀念搞不懂... 經過前輩的指導......我大概懂了..... 非常謝謝你......
系統時間:2024-07-03 12:36:00
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!