(原創)[短小精悍系列]RGB(RGI/RGV)顏色明度(亮度)計算公式 (又稱灰度公式,彩色照片轉黑白照片時能派上用場)

作者:❄️固態二氧化碳❄️ (主頁)
鏈接:(原創)[短小精悍系列]RGB(RGI/RGV)顏色明度(亮度)計算公式 (又稱灰度公式,彩色照片轉黑白照片時能派上用場) - 固態二氧化碳的博客 - CSDN博客
來源:CSDN博客
發表時間:2019年09月25日 10:37:23

著作權歸作者所有。商業轉載請聯繫作者獲得授權,非商業轉載請註明出處。

先上公式:
L=k(R255)2.2+(1.5G255)2.2+(0.6I255)2.22.2L=k\sqrt[2.2]{(\frac{R}{255})^{2.2}+(1.5\frac{G}{255})^{2.2}+(0.6\frac{I}{255})^{2.2}}
其中k=11+1.52.2+0.62.22.20.547373k=\sqrt[2.2]{\frac{1}{1+1.5^{2.2}+0.6^{2.2}}}≈0.547373
L取值範圍爲010\sim1,黑色L=0L=0,白色L=1L=1

友情提示:現在網上大多數計算公式(諸如0.30R+0.59G+0.11I之類的)都是錯的,因爲它們連最基本的gamma校正都沒考慮進去,結果自然會錯得十分離譜。看到這類形式十分簡單,只有加法和乘法,連根號都不帶的公式,一律都是錯的!

  目前絕大多數電腦,手機,平板,電視等電子設備使用sRGB色彩空間。觀測表明,在大部分使用sRGB色彩空間的顯示器上,紅(R),綠(G),藍(B)三原色的亮度(心理亮度)比爲1:1.5:0.6\color{#0080FF}1:1.5:0.6,也就是說,RGI三分量數值爲1:23:531:\frac{2}{3}:\frac{5}{3},即3:2:53:2:5時,亮度相等,對應的十六進制值分別爲#990000,#006600,#0000FF(不同顯示器顯示效果可能會有偏差,也可能同一臺顯示器因爲調整過色溫而導致誤差,但大概八九不離十,這裏的比值是根據大量顯示器顯示效果統計得來的平均值)。
  至於原因嘛,那就是三原色配比成白色的問題了,又叫白平衡。如果三原色亮度嚴格按照1:1:1配比,那麼顏色就會明顯偏冷,就像這樣一個顏色:#DDCCFF,一種偏藍紫色的顏色,這是因爲我們對冷色光(高頻光,藍紫色光)太過於敏感,而對暖色光(低頻光)敏感性則略遜一籌。打個很簡單的比方,紅色和藍色疊加得到的紫色更偏向於冷色(藍色),而不是暖色(紅色)。再比如,白色中缺少一點點紅色的冰藍色(#CCFFFF)和白色中缺少一點點藍紫色的淡黃色(#FFFFCC),明顯前者更接近白,後者則太黃,如果放在手機上面,兩者就是所謂的"冷屏"和"暖屏",說得不好聽一點,後者就是傳說中的"shi黃屏"。
  所以爲了避免這個問題,三原色的配比不能嚴格按照1:1:1,而是紅綠色要比藍紫色多,才能保證生成完美的白色,也就是不冷不暖的白色,因爲人眼對於冷色太過於敏感。這也就導致了RGB RGI(RGV)中三原色的亮度不一致,綠色亮度比較大,紅色適中,而藍紫色(靛色)則明顯偏深。爲了合成出真正的藍色,我們需要在藍紫色分量(B)(I/V)中加入適量的綠色分量(G),這樣既把原來偏紫的藍變正宗了,而且亮度也變大了。所以在RGB RGI(RGV),正宗的藍色對應的色相爲210°,而不是240°,這一點我在之前的文章已經說過了。
  最後一點,剛纔我所說的"亮度"指的都是心理亮度,但是還有一種亮度,稱爲"物理亮度",這是怎麼回事呢?原來,物理亮度由功率決定,與功率成正比,而人眼對亮度的感知與功率並不成正比,而是冪函數的關係,這個函數的指數我們通常稱作伽馬(gamma)值,符號爲γ。如果我們把物理亮度記爲LpL_p,心理亮度記爲LL,則有Lp=LγL_p=L^γ,而大量研究表明,這個伽馬值通常在1.8~2.6之間,在絕大多數發光設備上,這個值取的是2.2,所以我們有Lp=L2.2L_p=L^{2.2}而我們常說的RGI三分量的大小對應的是心理亮度,雖然有極少數用物理亮度表示,通常把前者稱爲Gamma(非線性)空間,後者稱爲線性空間。關於線性和非線性空間的知識,我會在以後的博文重點講解的。
  而色光亮度的合成是遵循物理亮度(線性空間)的,並非心理亮度,而最後合成得到的亮度又要換算成心理亮度。而之前我們有,RGI三原色心理亮度比爲1:1.5:0.61:1.5:0.6,故物理亮度比爲1:1.52.2:0.62.21:1.5^{2.2}:0.6^{2.2}。因此對於某種顏色的亮度(心理亮度),我們有
L2.2=k2.2[(R255)2.2+(1.5G255)2.2+(0.6I255)2.2] L^{2.2}=k^{2.2}[(\frac{R}{255})^{2.2}+(1.5\frac{G}{255})^{2.2}+(0.6\frac{I}{255})^{2.2}]   規定白色的亮度爲1,則1=k2.2(1+1.52.2+0.62.2)1=k^{2.2}(1+1.5^{2.2}+0.6^{2.2})
  解得k=11+1.52.2+0.62.22.20.547373k=\sqrt[2.2]{\frac{1}{1+1.5^{2.2}+0.6^{2.2}}}≈0.547373
  將前面的長式子兩邊開2.2次方,得
L=k(R255)2.2+(1.5G255)2.2+(0.6I255)2.22.2 L=k\sqrt[2.2]{(\frac{R}{255})^{2.2}+(1.5\frac{G}{255})^{2.2}+(0.6\frac{I}{255})^{2.2}}   噫,大家發現了什麼嗎?如果把R255\frac{R}{255},1.5G2551.5\frac{G}{255},0.6I2550.6\frac{I}{255}看成一個整體,這公式和勾股定理長得賊像!只不過指數由2變成2.2(伽馬值)。而這三個整體,反映的正是三個分量對應的亮度!看來,光的(心理)亮度的合成是遵循"勾股定理"的,只不過指數變成了2.2,我們姑且把它稱之爲"類勾股定理"吧!(其實,在數學上,這個玩意叫範數,通俗地說,指數爲p的"勾股定理"對應的就是p-範數。比如說歐氏幾何的勾股定理就是2-範數,而剛纔所說的亮度的合成,就是2.2-範數)。利用這個定理,我們就可以解釋爲什麼紅色(L=kL=k)和綠色(L=1.5kL=1.5k)合成的黃色的亮度並不是2.5k2.5k,顯著高於綠色,而是1.75345k1.75345k,與綠色亮度相差無幾,類比勾股定理,你就可以很直觀地去理解它了。
  在以後的文章中,我還會繼續利用"勾股定理"這個思想去解決關於亮度的問題的。

  最後,附上算法代碼(C語言)。共兩個函數,lightness函數返回亮度值(0~1),rgb2gray函數返回灰度值(0~255)

#include <math.h>
typedef unsigned char uint8;

const float k=0.547373141f;

float lightness(uint8 R,uint8 G,uint8 I)
{
    return pow(pow(R/255.0f,2.2f)+pow(G/170.0f,2.2f)+pow(I/425.0f,2.2f),1/2.2f)*k;
}

uint8 rgb2gray(uint8 R,uint8 G,uint8 I)
{
    return (uint8)(pow(pow(R,2.2f)+pow(G*1.5f,2.2f)+pow(I*0.6f,2.2f),1/2.2f)*k);
}

  將彩色照片轉換成黑白照片時,只需將每一個像素點的亮度值乘上255即可得到其等價灰度值,即黑白照片中RGI三個分量共同的值

作者:❄️固態二氧化碳❄️ (主頁)
鏈接:(原創)[短小精悍系列]RGB(RGI/RGV)顏色明度(亮度)計算公式 (又稱灰度公式,彩色照片轉黑白照片時能派上用場) - 固態二氧化碳的博客 - CSDN博客
來源:CSDN博客
發表時間:2019年09月25日 10:37:23

著作權歸作者所有。商業轉載請聯繫作者獲得授權,非商業轉載請註明出處。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章