轉灰階的問題 |
答題得分者是:zen
|
chj
一般會員 發表:14 回覆:17 積分:6 註冊:2003-08-09 發送簡訊給我 |
|
RaynorPao
版主 發表:139 回覆:3622 積分:7025 註冊:2002-08-12 發送簡訊給我 |
引言: 請問先進: 假設圖是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 發送簡訊給我 |
|
dllee
站務副站長 發表:321 回覆:2519 積分:1711 註冊:2002-04-15 發送簡訊給我 |
引言: 這樣做好像會失真吧! 請問有不失真的辦法嗎失真! 由「全彩轉灰階」的動作本來就是會失真的呀?! 如果您指的是轉出來的效果與 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 發送簡訊給我 |
大家好:
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 發送簡訊給我 |
|
Royce520
高階會員 發表:18 回覆:157 積分:100 註冊:2002-09-13 發送簡訊給我 |
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 發送簡訊給我 |
如果是這個問題,我以前在寫影像處理作業時也遇到過。
就是如果使用 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 發送簡訊給我 |
|
dllee
站務副站長 發表:321 回覆:2519 積分:1711 註冊:2002-04-15 發送簡訊給我 |
引言: 各位好: 如果有說錯請見諒 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 發送簡訊給我 |
大家好:
可是下面連結Cooky Kid大哥的範例
http://delphi.ktop.com.tw/topic.php?TOPIC_ID=37703
直接調整色盤的結果,還是會有失真的現象
還是因為如Royce520大哥所說ACDSee轉灰階的方式不一樣所致< >
謝謝各位高手來相助< > 順心
|
zen
一般會員 發表:0 回覆:3 積分:5 註冊:2003-02-20 發送簡訊給我 |
大家好:
我想這種情形並沒有那麼複雜,只是如同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 發送簡訊給我 |
|
zen
一般會員 發表:0 回覆:3 積分:5 註冊:2003-02-20 發送簡訊給我 |
|
dllee
站務副站長 發表:321 回覆:2519 積分:1711 註冊:2002-04-15 發送簡訊給我 |
引言: 大家好: 可是下面連結Cooky Kid大哥的範例 http://delphi.ktop.com.tw/topic.php?TOPIC_ID=37703 直接調整色盤的結果,還是會有失真的現象 還是因為如Royce520大哥所說ACDSee轉灰階的方式不一樣所致< > 謝謝各位高手來相助< > 順心 >>< face="Verdana, Arial, Helvetica">引言:Cooky Kid 的作法在一開始就已造成失真,如以上紅色部分,直接將全彩以 TBitmap 內建的 24 bit彩色 轉 8bit彩色。之後的程式碼是在將所得到的 8bit 彩色色盤變成灰階,如此的灰階色盤並不是真的 256 灰階色盤。 zen 作出來的才是真的 256 灰階色盤。 感謝分享。 沒空更新的網頁... http://dllee.ktop.com.tw C及指標教學,計算機概論,資訊管理導論... http://dllee.adsldns.org 介紹Shells,LiteStep,GeoShell....{//先建立一暫時圖檔,並將Image1複製過來 Graphics::TBitmap *tmpBmp = new Graphics::TBitmap(); tmpBmp->Assign(Image1->Picture->Bitmap); //再設定暫時圖檔為8位元(256色) tmpBmp->PixelFormat = pf8bit;
------
http://www.ViewMove.com |
chj
一般會員 發表:14 回覆:17 積分:6 註冊:2003-08-09 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |