色相環是一個封閉的圓,而黑與白不在圓周上的任何位置——它們在穿過圓心、垂直於這個平面的那條軸上。這個幾何安排不是約定俗成,它反映了一個可測量的事實:明度是一個獨立於色相的知覺維度,而且它的刻度是非線性的。中灰不是 50% 的光,是大約 18%。這一篇說明這個數字從哪裡來。
📖 學
一、三維的色彩空間,黑白佔的是哪一維
任何實用的色彩模型都是三維的,而維度的切法大同小異:
| 系統 | 明度維 | 另外兩維 |
|---|---|---|
| Munsell | Value(0–10) | Hue、Chroma |
| CIELAB | L*(0–100) | a*、b* |
| HSL | Lightness | Hue、Saturation |
| CIELCh | L* | C*(彩度)、h(色相角) |
黑白灰是所有這些系統裡「另外兩維歸零」的那條線。 Munsell 稱之為中性軸,記作 N0(黑)到 N10(白)。
為什麼明度要單獨成一軸,而不是當成「某個顏色的亮暗版本」? 因為它在知覺上可以獨立變動:你可以保持色相與彩度不變而只改明度,觀察者會報告「同一個顏色,比較亮」。反過來,明度相同而色相不同的兩個顏色,在轉成灰階後會變成同一個灰——這正是明度軸獨立性的操作型定義。
這也解釋了一個常見的設計陷阱:兩個色相差異很大、明度卻接近的顏色(例如中等紅與中等綠),在灰階下會糊成一團,對色覺異常者也幾乎無法區分。「用顏色區分資訊」若沒有同時給出明度差,就是不可及的設計,見 對比與易讀性。
二、立方根:知覺明度與物理亮度的關係
把反射率 50% 的灰卡與 100% 的白紙並排,灰卡看起來不像白紙的一半暗——它看起來比「一半」亮得多。
人對明度的知覺大致隨亮度的立方根變化。這個關係在 CIELAB 出現之前就已經由多條獨立的路徑建立:Munsell 的 value 標度(由大量人眼配對實驗建成)、Stevens 的冪次定律(指數約 1/3)、以及更早的 Weber–Fechner 近似。
CIELAB 的 L* 就是把這件事形式化。核心形式是:
L* = 116 × f(Y/Yn) − 16
其中 Y 是相對亮度,Yn 是參考白的亮度,
f(t) = t^(1/3) 當 t 大於某個門檻
f(t) = (線性段) 當 t 很小
兩個設計細節值得注意:
為什麼是 116 × ... − 16 而不是直接 100 × t^(1/3)? 為了讓 Y/Yn = 1(參考白)時 L* = 100,同時讓曲線在低端有合理行為。
為什麼低端要換成線性段? 因為純立方根函數在零點的斜率是無限大,數值上不穩定,而且不符合實際的低亮度知覺。CIELAB 的做法是在接近黑的地方接一段直線。
實際的冪次效果約為 0.43,而不是正好 1/3——因為那個 −16 的偏移讓整體曲線的等效指數偏離純立方根。
L* = 50 對應的相對亮度約是 18%,不是 50%。 這就是攝影灰卡定在 18% 的理由:它是知覺上的中間,不是物理上的中間。
L* 的另一個關鍵性質是感知均勻:L* = 50 與 L* = 25 的知覺差距,大致等於 L* = 75 與 L* = 50 的差距。這是它優於直接用亮度 Y 的地方。
三、Gamma:螢幕上的黑白編碼
這條立方根曲線在數位影像裡以另一個名字出現:gamma。
8 位元只有 256 個灰階可用。如果把它們線性地對應到亮度,暗部的相鄰階之間會出現明顯的跳階(因為人眼在暗處對相對差異更敏感),而亮部則浪費了大量無法分辨的階。
解法是用非線性編碼:儲存的數值大致對應知覺明度而非物理亮度,顯示時再轉回去。sRGB 的傳輸函數就是一條近似 gamma 2.2 的曲線(實際是一段線性加一段冪次,與 L* 的結構相似,理由也相同)。
兩個實務後果:
「50% 灰」有兩種意思。 在 Photoshop 填 #808080(數值上的一半)得到的是知覺上的中灰,它的物理亮度大約是白的 21%。若要物理亮度為一半,數值要填到約 #BCBCBC。混淆這兩者是影像處理最常見的錯誤之一,特別是在做模糊、縮放、混合時——這些運算在數學上應該在線性光空間做,在 gamma 空間做會讓結果偏暗(典型症狀是縮小後的影像暗部糊成一片、或高斯模糊後亮處「縮水」)。
灰階轉換不是三個通道取平均。 把彩色轉灰階時,(R+G+B)/3 是錯的,因為人眼對綠最敏感、對藍最不敏感。正確做法是用相對亮度的加權(Rec. 709 的係數約為 0.2126 R + 0.7152 G + 0.0722 B,且必須在線性光下運算)。這個係數組合直接來自錐細胞的光譜敏感度分布。
四、灰階、位元深度與 banding
多少階的灰才夠? 這取決於你在哪一段看。
因為知覺對相對差異敏感(Weber 定律的近似),暗部需要更密的階。8 位元的 sRGB 在多數內容上夠用,但在大面積平緩漸層上會出現 banding(條帶)——相鄰階的差異跨過了可辨閾值。
為什麼漸層特別容易出事? 因為 馬赫帶:階躍邊界會被視覺系統的高頻增強放大,一個數值上只差 1 的邊界被看成一條明顯的線。
對策有三個:提高位元深度(10-bit 以上)、加入少量雜訊(dithering,把階躍打散成隨機分布)、或避免大面積平緩漸層。加雜訊有效正是因為它破壞了邊界的空間規律性,讓高頻增強沒有東西可增強。
五、為什麼黑白照片仍然資訊完整
把這一篇與 感知那篇 接起來,可以回答一個核心問題:丟掉兩個維度(色相、彩度)只留一個(明度),為什麼看起來沒有丟掉三分之二的資訊?
因為三個維度承載的資訊量本來就極不對稱。 亮度通道的空間解析度遠高於色度通道——這正是影像壓縮普遍採用色度次取樣(chroma subsampling,例如 4:2:0 把色度的解析度砍到四分之一)卻幾乎看不出來的原因。我們對顏色的空間細節,本來就看得很粗。
形狀、邊界、紋理、深度線索,幾乎全部編碼在明度通道裡。所以黑白影像保留的是資訊量最大的那一個維度,丟掉的是解析度本來就低的兩個。這是「黑白不損失結構」最紮實的技術解釋,也是 著迷那篇 的論證前提。
🧠 記
黑白是明度軸,不在色相環上;明度軸的操作型定義是「轉灰階後相同的顏色,明度相同」。
知覺明度 ≈ 亮度的立方根,所以 L* = 50 對應約 18% 的相對亮度——這是灰卡 18% 的由來。
#808080 是知覺中灰不是物理中灰,物理一半亮度約在 #BCBCBC;模糊、縮放、混合應在線性光下做。
灰階轉換不能三通道取平均,要用亮度加權且在線性光下運算。
Banding 是馬赫帶放大了階躍,所以加雜訊有效——它破壞了邊界的規律性。
亮度通道的空間解析度遠高於色度通道,這是黑白影像不損失結構的技術解釋,也是色度次取樣可行的原因。
✍️ 實踐
驗證「知覺中灰不是物理中灰」,15 分鐘:
- 在任一繪圖軟體開一張圖,左半填
#000000、右半填#FFFFFF。 - 中間放一個方塊,填
#808080。退遠看——它看起來應該接近兩側的中間。 - 現在把方塊改填
#BCBCBC(物理亮度約 50%)。它會明顯偏亮。 - 再做一次對照:把整張圖縮小到 25%(讓黑白條紋混合),縮小後的平均值會偏向哪一邊?
第 4 步會暴露 gamma 問題:如果軟體在 gamma 空間縮放,黑白各半的區域縮小後會得到約 #808080(看起來合理但物理上錯);若在線性光下縮放會得到約 #BCBCBC(物理正確但看起來偏亮)。兩者都「對」,取決於你要的是什麼——而知道自己在哪個空間運算,是影像工作的基本功。
🔗 延伸學習
- Wikipedia — CIELAB color space——
L*a*b*的完整定義、轉換公式與低端線性段的處理。 - Wikipedia — Lightness——明度的各種定義、Munsell value 與立方根關係的歷史脈絡。
- Wikipedia — Stevens’s power law——知覺量與物理量的冪次關係,明度只是其中一個案例。
相關
- 黑白研究——黑與白的著迷、互補,與顏色學(hub)
- 物理本質
- 感知與錯覺
- 對比與易讀性
- 直播視頻研究 — gamma 與非線性編碼在影像管線裡的實作