亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

我相信我在 sRGB 和線性 RGB 之間正確轉換,那么為什么深色的結果看起來更差?

我相信我在 sRGB 和線性 RGB 之間正確轉換,那么為什么深色的結果看起來更差?

Go
不負相思意 2023-02-21 13:15:21
在研究了sRGB 上的維基百科條目后,我實現了一組函數來幫助進行顏色轉換:import "math"// https://en.wikipedia.org/wiki/SRGB#Transformationvar byteDecoded [256]float32 = func() (floats [256]float32) {    for i := 0; i < 256; i++ {        floats[i] = float32(i) / 255    }    return floats}()// Standard returns the sRGB color space value in range [0.0-1.0] for v, assuming v is in linear RGB in range [0.0-1.0].func Standard(v float32) float32 {    if v <= 0.0031308 {        return v * 12.92    }    return float32(1.055*math.Pow(float64(v), 1.0/2.4) - 0.055)}// Standardb returns the sRGB color space value in range [0-255] for v, assuming v is in linear RGB in range [0.0-1.0].func Standardb(v float32) uint8 {    if v >= 1 {        return 255    }    if v <= 0 {        return 0    }    return uint8(Standard(v)*255 + 0.5)}// Linear returns the linear RGB color space value in range [0.0-1.0] for v, assuming v is in sRGB in range [0.0-1.0].func Linear(v float32) float32 {    if v <= 0.04045 {        return v * (1.0 / 12.92)    }    return float32(math.Pow((float64(v)+0.055)/1.055, 2.4))}// Linearb returns the linear RGB color space value in range [0.0-1.0] for b, assuming b is in sRGB in range [0-255].func Linearb(b uint8) float32 {    return Linear(byteDecoded[b])}然后我玩了一些結果。log.Printf("Half of sRGB 255 calculated in linear RGB is %d", Standardb(Linearb(255)/2))版畫Half of sRGB 255 calculated in linear RGB is 188。然后我做了這個:上半部分:棋盤格紅色 (255, 0, 0) 和綠色 (0, 255, 0) 像素。左下角:使用 2 (128, 128, 0) 劃分的原始混音。右下角:(188, 188, 0)下半部分顯示了兩種不同的嘗試,當在兩個軸上按比例縮小 50% 時,上半部分會是什么樣子。由于上半部分是交錯的全綠色和全紅色像素,因此縮小比例必須將一半紅色和一半綠色加在一起,其值是我之前計算的值 (188)。右下角與我的普通消費者顯示器上的上半部分完全吻合,所以看起來整個轉換數學都在起作用。但是深色呢?log.Printf("Half of sRGB 64 calculated in linear RGB is %d", Standardb(Linearb(64)/2))版畫Half of sRGB 64 calculated in linear RGB is 44。我和以前一樣:上半部分:棋盤格深紅色 (64, 0, 0) 和深綠色 (0, 64, 0) 像素。左下角:使用 2 (32, 32, 0) 劃分的原始混音。右下角:(44, 44, 0)這一次,在我的顯示器上,樸素(不正確)的方法幾乎完美地匹配了上半部分,而我在右下角努力計算的值看起來太亮了。我做錯了嗎?或者這只是消費者顯示設備上預期的錯誤程度?
查看完整描述

1 回答

?
阿波羅的戰車

TA貢獻1862條經驗 獲得超6個贊

我做錯了嗎?

是和不是。您的代碼是正確的,但您的測試方法有疏忽:

這只是消費者顯示設備上預期的錯誤程度嗎?

是的。特別是,這很可能是由顯示面板的控制驅動程序引起的。在這里看到有人做出類似的觀察:https://electronics.stackexchange.com/questions/401617/lcd-pixels-how-chess-board-pixel-fill-patterns-are-called

通過從棋盤像素圖案到交替著色的水平像素線,可以降低問題的嚴重性。數學結果是一樣的,但結果看起來卻大不相同。

第一張帶水平線的圖片:

http://img1.sycdn.imooc.com//63f453b40001549f06020438.jpg

第二張帶水平線的圖片:

http://img1.sycdn.imooc.com//63f453c300010b4d06030440.jpg

獎勵:帶有垂直線的第二張圖片(試著瞇著眼睛;對我來說它看起來更準確):

http://img1.sycdn.imooc.com//63f453ce0001449a06020438.jpg

另請注意,就顯示的準確能力而言,“普通消費者顯示器”已經是一個廣泛的范圍。如果我將這個非常 Stackoverflow 窗口拖到我更便宜的第二臺顯示器上,我完全無法確認您所做的任何斷言,因為它的顏色輸出非常不準確。



查看完整回答
反對 回復 2023-02-21
  • 1 回答
  • 0 關注
  • 297 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號