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

轉灰階的問題

答題得分者是:zen
chj
一般會員


發表:14
回覆:17
積分:6
註冊:2003-08-09

發送簡訊給我
#1 引用回覆 回覆 發表時間:2003-09-20 10:48:54 IP:218.165.xxx.xxx 未訂閱
請問先進: 假設圖是100*100好了 我現在有一張灰階的圖 100*100*24bits 也就是說每一個pixel的RGB值都一樣 我要如何把他轉成 100*100*8bit 也就是每個pixel只用8bit表示而不是24bit呢 就好像是ACDSee FotoCanvas 裡將color轉成 256gray 的那個功能 謝謝
RaynorPao
版主


發表:139
回覆:3622
積分:7025
註冊:2002-08-12

發送簡訊給我
#2 引用回覆 回覆 發表時間:2003-09-21 00:01:23 IP:61.221.xxx.xxx 未訂閱
引言: 請問先進: 假設圖是100*100好了 我現在有一張灰階的圖 100*100*24bits 也就是說每一個pixel的RGB值都一樣 我要如何把他轉成 100*100*8bit 也就是每個pixel只用8bit表示而不是24bit呢 就好像是ACDSee FotoCanvas 裡將color轉成 256gray 的那個功能 謝謝
chj 你好: 試試看以下這篇的做法可不可行呢??
------
-- 若您已經得到滿意的答覆,請適時結案!! --
-- 欲知前世因,今生受者是;欲知來世果,今生做者是 --
-- 一切有為法,如夢幻泡影,如露亦如電,應作如是觀 --
chj
一般會員


發表:14
回覆:17
積分:6
註冊:2003-08-09

發送簡訊給我
#3 引用回覆 回覆 發表時間:2003-09-22 10:36:30 IP:140.123.xxx.xxx 未訂閱
這樣做好像會失真吧! 請問有不失真的辦法嗎
dllee
站務副站長


發表:321
回覆:2519
積分:1711
註冊:2002-04-15

發送簡訊給我
#4 引用回覆 回覆 發表時間:2003-09-22 22:22:05 IP:61.224.xxx.xxx 未訂閱
引言: 這樣做好像會失真吧! 請問有不失真的辦法嗎
失真! 由「全彩轉灰階」的動作本來就是會失真的呀?! 如果您指的是轉出來的效果與 ACDSee 或其他的繪圖軟體不一樣,那是它們所採用的全彩轉灰階的公式不同。 包大人的 http://delphi.ktop.com.tw/topic.php?TOPIC_ID=26438 所使用的是 灰階值=(紅 綠 藍)/3 但一般的繪圖軟體都不會用這個公式,因為,我們人眼對三原色本身就有不同的感覺,我們會認為純綠比較亮、純紅較暗、而純藍是最暗,所以,一般的繪圖軟體會使用 灰階值= 0.30*紅 0.59*綠 0.11*藍 這樣作出來的效果就與繪圖軟體相同。 其實您可以使用純紅、純綠、純藍的圖給繪圖軟體去轉,就可以得到以上公式了。而以上的公式也是某個視訊規範的亮度計算公式。 沒空更新的網頁... http://dllee.ktop.com.tw C及指標教學,計算機概論,資訊管理導論... http://dllee.adsldns.org 介紹Shells,LiteStep,GeoShell....
------
http://www.ViewMove.com
taishyang
站務副站長


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

發送簡訊給我
#5 引用回覆 回覆 發表時間:2003-09-22 22:57:28 IP:140.135.xxx.xxx 未訂閱
大家好:  chj會員指的是,24bit灰階圖轉成8bit灰階圖畫面會有些許的失真  但用ACDSee轉8bit灰階卻不會 我測試的結果的確如 > 圖一 src="http://delphi.ktop.com.tw/loadfile.php?TOPICID=11824840&CC=264460"> 圖二 以程式轉換後的8bit灰階圖(用RaynorPao或dllee版主所說的方式) 圖三 以ACDSee轉8bit灰階 會發現在右下角或左下角漸層的感覺不一樣耶 因為要上傳 > 發表人 -
chj
一般會員


發表:14
回覆:17
積分:6
註冊:2003-08-09

發送簡訊給我
#6 引用回覆 回覆 發表時間:2003-09-22 23:28:25 IP:140.123.xxx.xxx 未訂閱
恩,我要表達的就是taishyangc會員範例的意思 我並不是要將彩色的圖轉成灰階,而是要將24bit灰階轉成8bit灰階 照理說,24bit灰階能表現的也是256個gray level 8bit也是表現出256個gray level 所以不應該有失真的情形 不知哪位大大能為我解惑
Royce520
高階會員


發表:18
回覆:157
積分:100
註冊:2002-09-13

發送簡訊給我
#7 引用回覆 回覆 發表時間:2003-09-23 02:24:50 IP:61.230.xxx.xxx 未訂閱
dear chj and all,   我個人的猜想 因為我沒有 taishyang 的那張圖(因為圖太小)   所以我沒寫程式驗證... 不過個人的想法是這樣的      taishyang 所提供第二張圖 的左下與右下 看起來漸層是出了   問題 也就是原來的明暗變化 被不正常處理了... 所以看起來很   突兀...      有個問題是 dllee 所提到的 YUV 轉換:   Y = 0.299 * R + 0.587 * G + 0.114 * B     這裡所指的  R, G, B 是在線性比例下的...   原因是 影像數值(pixel value) 與亮度間的關係   不是一個線性關係 所以我們通常需要用一個關係來表示   假定 ACDSee 是用 gamma 2.2 方式來表示...      所以是這樣 R = pow(double(fPixel_RValue/255.0, gamma);   G, B 也是這樣換算      因此, 大家應該可以想得到... 數值是不一樣 Middle Tone 部分   是會不一樣的 所以層次感 就被改變了          *真實的事物最美, 簡單的道理最好, 我能體會的 太少*
------
不要忘記呼吸,不要忘記編程! ∩__∩
dllee
站務副站長


發表:321
回覆:2519
積分:1711
註冊:2002-04-15

發送簡訊給我
#8 引用回覆 回覆 發表時間:2003-09-23 09:25:43 IP:61.224.xxx.xxx 未訂閱
如果是這個問題,我以前在寫影像處理作業時也遇到過。 就是如果使用 TImage 顯示後再取點資料,可能已經被顯示卡濾波了! 在 TBitmap::HandleType 不是有所謂的  enum TBitmapHandleType {bmDIB, bmDDB}; DDB, Device Dependent Bitmap, DIB, Device Independent Bitmap. 設設看,或許可以解決。 如果您可以直接讀 BMP 的檔案直接轉,我想就不會出現問題了。 另一個是螢幕設定請使用 24bits 或 32bits 的色彩解析度,不然就請自行建立 256 色灰階調色盤。 這樣問題就可以解決了。    沒空更新的網頁... http://dllee.ktop.com.tw C及指標教學,計算機概論,資訊管理導論... http://dllee.adsldns.org 介紹Shells,LiteStep,GeoShell....
------
http://www.ViewMove.com
JerryKuo
版主


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

發送簡訊給我
#9 引用回覆 回覆 發表時間:2003-09-23 10:56:14 IP:61.230.xxx.xxx 未訂閱
各位好: 如果有說錯請見諒 pf8bit如果沒記錯,應該是指256色,不是灰階,所以pf8bit 並沒有包涵所有的灰階(0~255),有些24bits灰階色因此就 被其他8bits的灰階色取代,所以原本是平順色調,儲存為 8bits時,就會有某一範圍的灰階被一個灰階值取代,所以才 會出現在漸層的現象。
dllee
站務副站長


發表:321
回覆:2519
積分:1711
註冊:2002-04-15

發送簡訊給我
#10 引用回覆 回覆 發表時間:2003-09-23 12:18:41 IP:61.231.xxx.xxx 未訂閱
引言: 各位好: 如果有說錯請見諒 pf8bit如果沒記錯,應該是指256色,不是灰階,所以pf8bit 並沒有包涵所有的灰階(0~255),有些24bits灰階色因此就 被其他8bits的灰階色取代,所以原本是平順色調,儲存為 8bits時,就會有某一範圍的灰階被一個灰階值取代,所以才 會出現在漸層的現象。
沒錯! 如果直接將 pf24bit 變成 pf8bit 那失真就會很嚴重了。 對於轉換前的原始圖要使用 24bits 模式開啟,而在轉換得到灰階值後,使用 256 色灰階色盤及 pf8bit 模式就不會失真了。 沒空更新的網頁... http://dllee.ktop.com.tw C及指標教學,計算機概論,資訊管理導論... http://dllee.adsldns.org 介紹Shells,LiteStep,GeoShell....
------
http://www.ViewMove.com
taishyang
站務副站長


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

發送簡訊給我
#11 引用回覆 回覆 發表時間:2003-09-23 13:50:12 IP:140.135.xxx.xxx 未訂閱
大家好:   可是下面連結Cooky Kid大哥的範例   http://delphi.ktop.com.tw/topic.php?TOPIC_ID=37703 直接調整色盤的結果,還是會有失真的現象 還是因為如Royce520大哥所說ACDSee轉灰階的方式不一樣所致< > 謝謝各位高手來相助< > 順心
zen
一般會員


發表:0
回覆:3
積分:5
註冊:2003-02-20

發送簡訊給我
#12 引用回覆 回覆 發表時間:2003-09-23 14:51:31 IP:211.76.xxx.xxx 未訂閱
大家好: 我想這種情形並沒有那麼複雜,只是如同JerryKuo所說的,pf8bit是指256種顏色,但是不一定就是0~255的漸層灰階。    我的方法是自行建立0~255的調色盤,再指定給要灰階的影像:(照原發文者的假設,100*100*24bits)    
 
  //--------------------------製造256色灰階色盤-----------------------------//
  typedef struct {
    TLogPalette lPal;
    TPaletteEntry dummy[256];
  } LogPal;      LogPal SysPal;
  SysPal.lPal.palVersion = 0x300;
  SysPal.lPal.palNumEntries = 256;      for(int i=0;i<256;i  )
  {
     SysPal.lPal.palPalEntry[i].peRed   = (unsigned char)i;
     SysPal.lPal.palPalEntry[i].peGreen = (unsigned char)i;
     SysPal.lPal.palPalEntry[i].peBlue  = (unsigned char)i;
     SysPal.lPal.palPalEntry[i].peFlags = 0;  // peFlags must set to 0
  }
  //------------------------------------------------------------------------//      pBitmap24->LoadFromFile("24gray.bmp");
  Image1->Canvas->Draw(0,0,pBitmap24);      pBitmap8->PixelFormat = pf8bit;
  pBitmap8->Height = 100;
  pBitmap8->Width = 100;
  pBitmap8->Palette = CreatePalette(&SysPal.lPal); // assign the palette      for(j=0 ; j<100 ; j  )
  {
     ptr  = (Byte *)pBitmap24->ScanLine[j];
     ptr2 = (Byte *)pBitmap8->ScanLine[j];         for(i=0 ; i<100 ; i  )
        ptr2[i]  =  ptr[i*3];
  }
  Image2->Canvas->Draw(0,0,pBitmap8);
如此並不會有失真的情形
taishyang
站務副站長


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

發送簡訊給我
#13 引用回覆 回覆 發表時間:2003-09-23 15:40:40 IP:140.135.xxx.xxx 未訂閱
zen您好:   謝謝您的熱心分享< >< > 厲害厲害
zen
一般會員


發表:0
回覆:3
積分:5
註冊:2003-02-20

發送簡訊給我
#14 引用回覆 回覆 發表時間:2003-09-23 16:07:50 IP:211.76.xxx.xxx 未訂閱
引言: zen您好: 謝謝您的熱心分享< >< > 厲害厲害 < face="Verdana, Arial, Helvetica"> 您好, 我只是剛好會這個而已,程度還差的遠了,還要靠各位前輩多多指導阿… 這裡真是個溫暖的地方阿…
dllee
站務副站長


發表:321
回覆:2519
積分:1711
註冊:2002-04-15

發送簡訊給我
#15 引用回覆 回覆 發表時間:2003-09-23 21:38:13 IP:61.224.xxx.xxx 未訂閱
引言: 大家好: 可是下面連結Cooky Kid大哥的範例 http://delphi.ktop.com.tw/topic.php?TOPIC_ID=37703 直接調整色盤的結果,還是會有失真的現象 還是因為如Royce520大哥所說ACDSee轉灰階的方式不一樣所致< > 謝謝各位高手來相助< > 順心 < face="Verdana, Arial, Helvetica">
引言:
{//先建立一暫時圖檔,並將Image1複製過來
  Graphics::TBitmap *tmpBmp = new Graphics::TBitmap();
  tmpBmp->Assign(Image1->Picture->Bitmap);
  //再設定暫時圖檔為8位元(256色)
  tmpBmp->PixelFormat = pf8bit;
Cooky Kid 的作法在一開始就已造成失真,如以上紅色部分,直接將全彩以 TBitmap 內建的 24 bit彩色 轉 8bit彩色。之後的程式碼是在將所得到的 8bit 彩色色盤變成灰階,如此的灰階色盤並不是真的 256 灰階色盤。 zen 作出來的才是真的 256 灰階色盤。 感謝分享。 沒空更新的網頁... http://dllee.ktop.com.tw C及指標教學,計算機概論,資訊管理導論... http://dllee.adsldns.org 介紹Shells,LiteStep,GeoShell....
------
http://www.ViewMove.com
chj
一般會員


發表:14
回覆:17
積分:6
註冊:2003-08-09

發送簡訊給我
#16 引用回覆 回覆 發表時間:2003-09-24 10:22:37 IP:140.123.xxx.xxx 未訂閱
謝謝各位大大的教導 真是臥虎藏龍阿~~ 再次感激
系統時間:2024-04-29 2:52:25
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!