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

有誰可以解說一下關於計灰階值的程式嗎?

尚未結案
黑輪
中階會員


發表:135
回覆:188
積分:64
註冊:2004-01-29

發送簡訊給我
#1 引用回覆 回覆 發表時間:2004-02-07 17:38:22 IP:140.124.xxx.xxx 未訂閱
我用搜尋找有關灰階的程式,找到了,可是程式裡面有些程式不了解,大家知道的話可以說明一下嗎? 下面是程式:
   
Graphics::TBitmap *Bmp = new Graphics::TBitmap();
  Byte *ptr;
  int r,g,b;
  int gray;
  int i,j;
  //int threshold;      Bmp->Assign(Image1->Picture->Bitmap);
  for(j=0;jHeight;j  )
  {
    ptr = (Byte *)Bmp->ScanLine[j];
    for(i=0;iWidth;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;
      ptr[i*3]=(Byte)gray;
      ptr[i*3 1]=(Byte)gray;
      ptr[i*3 2]=(Byte)gray;
    }
  }
  Image2->Picture->Assign(Bmp);
裡面的: ptr = (Byte *)Bmp->ScanLine[j]; b=ptr[i*3]; g=ptr[i*3 1]; r=ptr[i*3 2]; gray=0.299*r 0.587*g 0.114*b; ptr[i*3]=(Byte)gray; ptr[i*3 1]=(Byte)gray; ptr[i*3 2]=(Byte)gray; 這些我不知道是什麼意思(為何要乘上哪些數字)? 感謝大家的幫忙哦~~~
taishyang
站務副站長


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

發送簡訊給我
#2 引用回覆 回覆 發表時間:2004-02-08 18:56:44 IP:61.231.xxx.xxx 未訂閱
黑輪您好:
引言: 這些我不知道是什麼意思(為何要乘上哪些數字)?
因為灰階值的分佈為0~255所以乘上那些數字的目的就是讓gray落在這範圍 灰階成分其實就是YCrCb模型或YUV模型中的Y分量 順心 <>~我也是在學習的階段,回答的不好請您多多見諒與指教~
黑輪
中階會員


發表:135
回覆:188
積分:64
註冊:2004-01-29

發送簡訊給我
#3 引用回覆 回覆 發表時間:2004-02-09 13:31:17 IP:140.124.xxx.xxx 未訂閱
哦~~哪是不是彩色圖片的RGB值,乘上哪些數字就可以變灰階值呢? 哪b=ptr[i*3];又是啥意思? g=ptr[i*3 1]; r=ptr[i*3 2]; 不好意思~~我不太清楚~~ 感謝您哦~~
taishyang
站務副站長


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

發送簡訊給我
#4 引用回覆 回覆 發表時間:2004-02-09 13:55:28 IP:140.135.xxx.xxx 未訂閱
黑輪您好:
引言: b=ptr[i*3];又是啥意思? g=ptr[i*3 1]; r=ptr[i*3 2];
變數宣告已經告入您了,就是取得r,g,b的值 順心
auslk
初階會員


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

發送簡訊給我
#5 引用回覆 回覆 發表時間:2004-02-09 21:05:18 IP:219.68.xxx.xxx 未訂閱
//定義 如下:  typedef struct  {  Byte B;  Byte G;  Byte R;  } pixel;     @ 一個PIXEL 有3個空間 分別儲存 B G R 順序!  @ 你讀出來後就是B G R         
引言: 哦~~哪是不是彩色圖片的RGB值,乘上哪些數字就可以變灰階值呢? 哪b=ptr[i*3];又是啥意思? g=ptr[i*3 1]; r=ptr[i*3 2]; 不好意思~~我不太清楚~~ 感謝您哦~~
黑輪
中階會員


發表:135
回覆:188
積分:64
註冊:2004-01-29

發送簡訊給我
#6 引用回覆 回覆 發表時間:2004-02-10 21:05:25 IP:140.124.xxx.xxx 未訂閱
原謝哦~~我了解~~感謝各位的幫忙哦
wasa
一般會員


發表:0
回覆:1
積分:0
註冊:2004-04-08

發送簡訊給我
#7 引用回覆 回覆 發表時間:2004-04-08 23:13:42 IP:163.28.xxx.xxx 未訂閱
不好意思喔 b=ptr[i*3];  g=ptr[i*3+1]; r=ptr[i*3+2]; 請問為什麼要乘以3? 為什麼要加1? 為什麼要加2? 我使用這個方法轉灰階 大張的圖是ok沒問題 可是小小張的圖卻沒辦法處理 不知有沒有高手可以幫忙解答    
引言: //定義 如下: typedef struct { Byte B; Byte G; Byte R; } pixel; @ 一個PIXEL 有3個空間 分別儲存 B G R 順序! @ 你讀出來後就是B G R
引言: 哦~~哪是不是彩色圖片的RGB值,乘上哪些數字就可以變灰階值呢? 哪b=ptr[i*3];又是啥意思? g=ptr[i*3 1]; r=ptr[i*3 2]; 不好意思~~我不太清楚~~ 感謝您哦~~
yhc0927
一般會員


發表:3
回覆:5
積分:1
註冊:2003-12-21

發送簡訊給我
#8 引用回覆 回覆 發表時間:2004-05-15 19:31:36 IP:203.204.xxx.xxx 未訂閱
這是我學前面的程式碼? 我想請問一下!為什麼執行到最後,我的Image2沒有轉成灰階的圖出來呢? 請問我是不是有作錯什麼地方呢? 謝謝 if(Form1->OpenPictureDialog1->Execute()) { int r,g ,b, gray; Byte *ptr; int i, j; Graphics::TBitmap *pBmpfile = new Graphics::TBitmap(); pBmpfile->Assign(Form1->Image1->Picture->Bitmap); Form1->Image1->Picture->LoadFromFile(Form1->OpenPictureDialog1->FileName); for(i = 0; i < pBmpfile->Height; i ) { ptr = (Byte *)pBmpfile->ScanLine[i]; for(j = 0; j < pBmpfile->Width; j ) { r = ptr[i*3 2]; g = ptr[i*3 1]; b = ptr[i*3]; gray = 0.299*r 0.587*g 0.114*b; ptr[i*3 2] = (Byte)gray; ptr[i*3 1] = (Byte)gray; ptr[i*3] = (Byte)gray; } } Form1->Image2->Picture->Assign(pBmpfile); }
arisaka_matsuri
高階會員


發表:25
回覆:205
積分:231
註冊:2003-10-19

發送簡訊給我
#9 引用回覆 回覆 發表時間:2004-05-16 11:15:02 IP:218.166.xxx.xxx 未訂閱
yhc0927 你好:
引言:
    pBmpfile->Assign(Form1->Image1->Picture->Bitmap);
    Form1->Image1->Picture->LoadFromFile(Form1->OpenPictureDialog1->FileName);
這兩行的順序顛倒了~
yhc0927
一般會員


發表:3
回覆:5
積分:1
註冊:2003-12-21

發送簡訊給我
#10 引用回覆 回覆 發表時間:2004-05-19 13:32:50 IP:203.204.xxx.xxx 未訂閱
引言: yhc0927 你好:
引言:
    pBmpfile->Assign(Form1->Image1->Picture->Bitmap);
    Form1->Image1->Picture->LoadFromFile(Form1->OpenPictureDialog1->FileName);
這兩行的順序顛倒了~ < face="Verdana, Arial, Helvetica"> 謝謝!後來檢查的時候有發現到 ㄏㄏㄏ 真的不好意思 謝謝你囉
fency
一般會員


發表:2
回覆:5
積分:1
註冊:2004-01-19

發送簡訊給我
#11 引用回覆 回覆 發表時間:2004-07-05 02:06:35 IP:218.175.xxx.xxx 未訂閱
引言: 不好意思喔 b=ptr[i*3]; g=ptr[i*3 1]; r=ptr[i*3 2]; 請問為什麼要乘以3? 為什麼要加1? 為什麼要加2? 我使用這個方法轉灰階 大張的圖是ok沒問題 可是小小張的圖卻沒辦法處理 不知有沒有高手可以幫忙解答
您好 因為一個pixel裡面又存著三個值,分別為B,G,R 因此假如今天想把一張圖裡面B值都取出來的話 那麻在第二個for迴圈裡應該就要寫成
for i:=0 to Bmp.width -1 do
begin
  B:=ptr[i*3];
end;
如此一來才能順利的把所有的B值給取出來
系統時間:2024-06-29 21:48:39
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!