亮度響應與HDR基礎

1. 基本概念

亮度響應

簡單地說,相機/膠片的亮度響應,就是指拍攝場景的真實亮度與成像後像素亮度/底片密度之間的關係。

很顯然,亮度響應的概念並不是數碼相機才有的,針對膠片一樣也有亮度響應的概念,參見 Sensitometry。 為說明問題方便,本文在不致引起混淆情況下不嚴格區分「亮度」、「光照度」、「曝光量」等概念, 行文中多以「亮度」敘述。

最理想情況下,我們希望這個亮度響應是個線性的關係。什麼意思呢? 就是說,無論一個場景原始的亮度是多少,如果場景入射的光亮度變成了 2 倍,那成像後的像素值也應該變成 2 倍。 在這種理想情況下,兩張曝光不同的照片,僅僅通過簡單的乘除運算就可以互相轉化。 事實上,這正是 倒易率 的理論依據。

亮度響應曲線

反應亮度響應的曲線,橫坐標一般為真實亮度的對數,縱坐標一般為像素亮度/底片密度, 也有反過來,以像素亮度/底片密度為橫坐標,以亮度的對數為縱坐標的。 亮度響應曲線也叫特徵曲線(characteristic curve)。

典型的膠片的亮度響應曲線如下圖所示(圖片來源 A PRACTICAL GUIDE TO USING FILM CHARACTERISTIC CURVES)

上圖展示了不同的膠片類型的特徵曲線,可以看到,在大部分亮度區間內,膠片的亮度響應是線性的(注意橫坐標是對數坐標)。這個區間範圍,對於彩色正片(第一排的兩幅圖)大約是 6~7 檔光圈, 對於負片(第二篇兩幅圖)可以達到 10 檔光圈以上。

在線性區間之外,低的一端向上翹曲,稱為「趾部」;高的一端向下彎曲,稱為「肩部」。 正是膠片的這種非線性響應特性,賦予了它豐富細膩的表達能力,也是 區域曝光法 的基礎。 這裡展開又是一個內容龐大的話題,此處按下不表。

2. 數碼相機的亮度響應曲線

數碼相機與膠片相比,有很多的優勢,那麼數碼相機的亮度響應曲線是什麼樣的呢?

我們知道,數碼相機的感光元件 CCD 或者 CMOS 對光線是非常敏感的,同時它們的線性程度非常好, 在非常大範圍內,數碼相機感光元件的輸出(電壓)與亮度呈現良好的線性關係。 那麼我們是不是可以認為,數碼相機的亮度響應曲線就是一條直線呢?其實不然。 相機廠商為了更好地模擬人眼視覺的非線性效應,同時也為了更有效地記錄很亮和很暗的場景, 會在感光元件的線性輸出基礎上,增加一個非線性變換,然後才輸出到圖像。

下圖是我自己的佳能 6D 相機的亮度響應曲線(紅色通道),可以明顯看到, 亮度響應曲線呈現類似於膠片特性曲線的 S 形輪廓。

從圖中我們可以看到,數碼相機的亮度響應曲線中的線性部分的範圍,比傳統膠片要小, 大約只有 3 檔光圈左右。這意味著,對數碼照片而言,增加和減少曝光, 並不是簡單地對當前像素值進行乘除運算,而應當是沿曲線滑動。

舉個例子,假設有一個點成像後亮度是 20%(如果是 8 bit 點陣圖格式,那麼就是 255 × 20% = 51), 問如果增加一檔曝光,這個點的像素值是多少?從圖中曲線上我可以讀到(具體選哪一條曲線對結果幾乎沒有影響), 亮度 20% 的點增加一檔曝光(橫坐標增加 1)後,亮度在 35% 左右。

當然,一般相機的感光元件都分為 RGB 三色,因此相機不同顏色通道的亮度響應曲線一般也是不一樣的。 下圖是我自己的佳能 6D 相機的三通道響應曲線。

引入這樣一種非線性關係,有什麼好處呢?

1. 充分利用了人眼的視覺特性,更好地記錄場景信息。

在一個固定場景中,人眼更多地注意中間亮度的情況,如果中間亮度範圍內的對比度足夠, 人眼就會覺得畫面是通透的;反之如果中間亮度範圍內對比度不足,就會覺得畫面發灰。 引入這樣的非線性,增加了中間亮度範圍內的對比度,同時也部分保留亮部和暗部的信息不缺失。

2. 讓畫面更接近人眼感官效果

人眼對一個場景中各個不同亮度的感知是非線性的,並且人眼可以對極亮和極暗的場景做出反應。 而相對的,將照片放在顯示器上或者列印出來,顯示器或者紙張並不能給出太大的明暗對比, 因此需要把一個較大的明暗範圍「壓縮」到顯示器或者列印紙張能夠反應的明暗範圍, 否則人眼看到會覺得缺失許多細節。 線性映射情況下,人眼看去容易產生太亮或者太暗的感覺,因此引入一定的非線性因素是有必要的。

上面兩張圖中,左圖是線性映射,右圖採用類似亮度響應曲線的 S 形曲線映射。兩張圖片中像素的取值範圍是一樣的,然而人眼看來右側的圖更接近真實感受,中間亮度部分對比度足夠,過亮和過暗的部分也能保留足夠的細節。

3. 實驗測量亮度響應曲線

說了那麼多,這個亮度響應曲線是怎麼得到的呢? 理論上,我們可以用光照度計(測光表)測量一個場景中每一點的實際亮度, 拍下照片後讀取圖片中每一點的像素值,把兩者畫在一起就得到亮度響應曲線了。 實際上當然不可能做到,我們需要設計一個更可行的方案。

我們固定相機的光圈和 ISO 設置,只改變快門速度,按不同曝光量拍攝同一個場景的多張照片。 在照片中的每一個點,在不同的曝光量下都會有不同的像素值。

我們把同一個點的不同曝光量下的像素值畫在一起,就得到了一條曲線,橫坐標是(對數)曝光量, 縱坐標是像素值。由於我們固定了光圈,因此橫坐標的(對數)曝光量,正比於曝光時間的對數, 所以可以直接採用曝光時間的對數作為橫坐標。

圖中所示的是照片中的三個點對應的三條曲線。還記得上文中提到的嗎?數碼相機改變曝光的話, 像素點的值是沿著亮度響應曲線移動的。這意味著,圖中每一條曲線,都是亮度響應曲線的一部分, 僅僅相差了一個平移量。如果把這幾條曲線左右平移一下,他們應該是能重合成一條光滑曲線的。 所以我們需要對不同像素點的多條曲線進行對齊。

對齊之後,我們就獲得了一條光滑的曲線,這就是相機的亮度響應曲線。 (本部分簡單介紹思路,詳細的數學過程放在最後,如果對數學不感興趣, 可以跳過)。

採集足夠多的數據點之後,對齊這些不同的曝光曲線(轉化為求解一個數學上的優化問題), 可以得到每一條曝光曲線的水平偏移量了(後面可以看到這個偏移量的用處), 進而可以得到一條光滑的亮度響應曲線。

4. 推算場景實際亮度

如果給定一個像素點,通過上面的計算過程,我們可以得到這個像素點對應的曝光曲線的水平偏移量。 這個偏移量是什麼意義呢?稍稍思考一下可以知道,這個偏移量實際上反映了這個點的真實亮度信息。 所以利用上面的計算過程,我們可以推算出圖中每一個點的真實亮度(相差一個常數係數)。下圖展示了這個場景中的實際亮度值,不同顏色反應了不同的亮度。

事實上,這已經是一張 HDR 圖片了,包含了這個場景中全部的亮度信息。在這張圖中, 最亮點與最暗點亮度之比約為 12 萬倍,換算成光圈為 16.9 檔光圈, 這已經比目前任何民用單反相機所能記錄的場景亮度範圍都大了。 經過「色調映射」(tone mapping)即可轉換為平時看到的 HDR 效果的照片了。 色調映射與前文所述的相機在亮度響應曲線中引入非線性有異曲同工之理。下圖就是經過簡單 gamma 映射的 HDR 照片。

有關色調映射相關的內容,在以後的專欄文章中再進行討論。

5. 對齊曝光曲線的數學討論

本小節內容可以跳過。

在前面小節中已經介紹了大體的思路,這裡稍稍詳細地進行展開。設 x_{ij} 是第 j 個點在第 i 次曝光中收到的(對數)曝光量,容易想到, 在光圈不變的情況下,這個曝光量與這個點的真實亮度和曝光時間的乘積成正比,設 x_{ij} = log_2(alpha ,t_i, I_j) = log_2 t_i + lambda_j,其中 t_i 是第 i 次曝光的曝光時間, I_j 是第 j 個點的真實亮度,alpha 是比例係數,lambda_j=log_2(alpha I_j) 就是上文中提到的水平偏移量。

f(x) 是亮度響應曲線。給定任意一個點的(對數)曝光量 x_{ij} 那麼它的像素值就是 p_{ij}=f(x_{ij})

我們要估計的偏移量是亮度方面的偏移量,如果直接利用亮度響應函數 f 本身進行計算, 那就需要估計自變數方面的未知數,這在計算上將帶來不便。 為計算方便,我們這裡將使用響應曲線 f 的反函數 g(cdot) = f^{-1}(cdot) 進行計算。也就是說,給定一個點的像素值 p_{ij}, 那麼 g(p_{ij}) 就給出這個點的(對數)曝光量。

綜合起來,我們可以寫出以下的優化問題。

min_{g,,lambda} sum_{i,j} left(g(,p_{ij}) - log_2 t_i - lambda_jright)^2

在這裡我採用的亮度響應函數的反函數,形式為,

g(p) = a_1 logleft(,p^{-a_2} - a_3right) + a_4

求解優化問題,得到最優擬合的係數,以及每一個點對應的(對數)亮度偏移量 lambda,這裡偏移量 lambda 包含了這個點的真實亮度的信息,可用於推算場景真實亮度。


推薦閱讀:

如何讓模糊圖片變得更清晰?
無痛理解系列---開篇
1.7【OpenCV圖像處理】 調整圖像亮度與對比度
到底Resnet在解決一個什麼問題呢?

TAG:数码相机 | 图像处理 | HDR |