作者:❄️固態二氧化碳❄️ (主頁)
鏈接:(原創)[短小精悍系列]RGB(RGI/RGV)顏色明度(亮度)計算公式 (又稱灰度公式,彩色照片轉黑白照片時能派上用場) - 固態二氧化碳的博客 - CSDN博客
來源:CSDN博客
發表時間:2019年09月25日 10:37:23
著作權歸作者所有。商業轉載請聯繫作者獲得授權,非商業轉載請註明出處。
先上公式:
其中
L取值範圍爲,黑色,白色
友情提示:現在網上大多數計算公式(諸如0.30R+0.59G+0.11I之類的)都是錯的,因爲它們連最基本的gamma校正都沒考慮進去,結果自然會錯得十分離譜。看到這類形式十分簡單,只有加法和乘法,連根號都不帶的公式,一律都是錯的!
目前絕大多數電腦,手機,平板,電視等電子設備使用sRGB色彩空間。觀測表明,在大部分使用sRGB色彩空間的顯示器上,紅(R),綠(G),藍(B)三原色的亮度(心理亮度)比爲,也就是說,RGI三分量數值爲,即時,亮度相等,對應的十六進制值分別爲#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)值,符號爲γ。如果我們把物理亮度記爲,心理亮度記爲,則有,而大量研究表明,這個伽馬值通常在1.8~2.6之間,在絕大多數發光設備上,這個值取的是2.2,所以我們有。而我們常說的RGI三分量的大小對應的是心理亮度,雖然有極少數用物理亮度表示,通常把前者稱爲Gamma(非線性)空間,後者稱爲線性空間。關於線性和非線性空間的知識,我會在以後的博文重點講解的。
而色光亮度的合成是遵循物理亮度(線性空間)的,並非心理亮度,而最後合成得到的亮度又要換算成心理亮度。而之前我們有,RGI三原色心理亮度比爲,故物理亮度比爲。因此對於某種顏色的亮度(心理亮度),我們有
規定白色的亮度爲1,則
解得
將前面的長式子兩邊開2.2次方,得
噫,大家發現了什麼嗎?如果把,,看成一個整體,這公式和勾股定理長得賊像!只不過指數由2變成2.2(伽馬值)。而這三個整體,反映的正是三個分量對應的亮度!看來,光的(心理)亮度的合成是遵循"勾股定理"的,只不過指數變成了2.2,我們姑且把它稱之爲"類勾股定理"吧!(其實,在數學上,這個玩意叫範數,通俗地說,指數爲p的"勾股定理"對應的就是p-範數。比如說歐氏幾何的勾股定理就是2-範數,而剛纔所說的亮度的合成,就是2.2-範數)。利用這個定理,我們就可以解釋爲什麼紅色()和綠色()合成的黃色的亮度並不是,顯著高於綠色,而是,與綠色亮度相差無幾,類比勾股定理,你就可以很直觀地去理解它了。
在以後的文章中,我還會繼續利用"勾股定理"這個思想去解決關於亮度的問題的。
最後,附上算法代碼(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
著作權歸作者所有。商業轉載請聯繫作者獲得授權,非商業轉載請註明出處。