高動態範圍(High-Dynamic Range,簡稱HDR)

高動態範圍(High-Dynamic Range,簡稱HDR)

一.HDR介紹

高動態範圍(High-Dynamic Range,簡稱HDR),又稱寬動態範圍技術,是在非常強烈的對比下讓攝像機看到影像的特色而運用的一種技術。
當在強光源(日光、燈具或反光等)照射下的高亮度區域及陰影、逆光等相對亮度較低的區域在圖像中同時存在時,攝像機輸出的圖像會出現明亮區域因曝光過度成爲白色,而黑暗區域因曝光不足成爲黑色,嚴重影響圖像質量。攝像機在同一場景中對最亮區域及較暗區域的表現是存在侷限的,這種侷限就是通常所講的“動態範圍“。HDR圖片是使用多張不同曝光的圖片,然後再用軟件組合成一張圖片。它的優勢是最終你可以得到一張無論在陰影部分還是高光部分都有細節的圖片。在正常的攝影當中,或許你只能選擇兩者之一。

廣義上的“動態範圍”是指某一變化的事物可能改變的跨度,即其變化值的最低端極點到最高端極點之間的區域,此區域的描述一般爲最高點與最低點之間的差值。這是一個應用非常廣泛的概念,在談及攝像機產品的拍攝圖像指標時,一般的“動態範圍”是指攝像機對拍攝場景中景物光照反射的適應能力,具體指亮度(反差)及色溫(反差)的變化範圍。

寬動態攝像機比傳統只具有3:1動態範圍的攝像機超出了幾十倍。自然光線排列成從120,000Lux到星光夜裏的0.00035Lux。當攝像機從室內看窗戶外面,室內照度爲100Lux,而外面風景的照度可能是10,000Lux,對比就是10,000/100=100:1。這個對比使人眼能很容易地看到,因爲人眼能處理1000:1的對比度。然而以傳統的閉路監控攝像機處理它會有很大的問題,傳統攝像機只有3:1的對比性能,它只能選擇使用1/60秒的電子快門來取得室內目標的正確曝光,但是室外的影像會被清除掉(全白);或者換種方法,攝像機選擇1/6000秒取得室外影像完美的曝光,但是室內的影像會被清除(全黑)。這是一個自從攝像機被髮明以來就一直長期存在的缺陷。

HDR可以令3D 畫面更像真,就像人的眼睛在遊戲現場中。在HDR的幫助下,我們可以使用超出普通範圍的顏色值,因而能渲染出更加真實的3D場景。

HDR是一種表達超過了顯示器所能表現的亮度範圍的圖像映射技術,已成爲目前遊戲應用不可或缺的一部分。通常,顯示器能夠顯示R、G、B分量在[0, 255]之間的像素值。而256個不同的亮度級別顯然不能表示自然界中光線的亮度情況。比如,太陽的亮度可能是一個白熾燈亮度的幾千倍,是一個被白熾燈照亮的桌面的亮度的幾十萬倍,這遠遠超出了顯示器的亮度表示能力。

想象在一個房間中,刺眼的陽光從窗外照進來,若使用常規方法渲染這個房間,房間中白色的牆壁的顏色是(255, 255, 255),陽光的顏色也是(255, 255, 255),牆壁將表現得和窗外的陽光顏色一樣。很明顯,這和我們現實看到的差異很大,現實場景中陽光要比牆壁刺眼很多,我們需要使用某種技術對陽光的亮度和牆壁的亮度進行處理,讓其在顯示器上的效果接近現實效果。

簡單的將高範圍的亮度按比例縮放後映射到[0, 255]是不可行的,比如將[0, 511]的範圍按照2:1映射到[0, 255],雖然表示的亮度範圍擴大了,但是將導致色帶(Color
Banding)問題,色帶如圖1所示。

在這裏插入圖片描述

圖1 左圖有色帶問題,右圖顯示正常

在有限的亮度範圍內顯示自然界中相當寬廣的亮度範圍,正是HDR技術所要解決的問題。

何時應開啓HDR?

風景照

HDR功能的一項經典應用就是藍天白雲下的風景照。開啓HDR後可以讓天更藍,草更綠。不過唯一的的例外是日出和夕陽,由於HDR功能會對太陽的曝光亮度做出錯誤判斷,反而會喪失了原有的動人色彩。

戶外人像

大太陽下拍攝人像往往不是件容易的事情,逆光拍攝經常會導致黑臉或黑眼圈,順光時則容易出現皮膚或高亮度物體過曝現象。HDR功能對這些問題的解決效果相當好,但使用時需要一些技巧。
在這裏插入圖片描述
圖2

圖中的四幅照片,左上爲直接拍攝,右上爲開啓HDR拍攝,左下爲觸摸對焦至人物面部,右下則是觸摸對焦後再開啓HDR的結果。結果很明顯,在遇到戶外背光人像的拍攝狀況時,我們應當首先將對焦點選擇在人物面部,然後再使用HDR功能拍攝,讓人物和背景都能有一個合適的曝光水平。

準備進行後期處理

如果你準備對拍攝的照片進行後期修改處理,那麼HDR照片會幫助你保留原始圖片中的更多細節。如果你不滿意HDR模式導致的飽和度和對比度下降,只要在Photoshop等軟件中稍作調節即可。

何時應關閉HDR?

拍攝運動物體

HDR模式下會連拍三張照片並進行合成。雖然連拍速度很快,但如果拍攝對象正在運動當中,合成的照片還是會出現重影現象。如果你經常碰到這種狀況,苦練穩手功和嘗試三腳架是唯一的解決方案。

高對比度照片

很多照片的意境都要通過鮮明的亮暗對比來實現。比如在專門拍攝陰影、倒影時,開啓HDR都只會讓對比度降低,失掉預想的效果。

捕捉鮮豔色彩

在這裏插入圖片描述

圖3. 右側爲開啓HDR效果

HDR模式可以找回暗部和亮部的色彩,但是當拍攝對象本身就明亮鮮豔時,開啓HDR只會導致飽和度降低。比如,同樣是拍攝風景照,但你要拍攝的主體是藍天,並不在乎地面出現陰影的時候,關閉HDR就能讓天色看起來更藍。

閃光燈照相

使用閃光燈時不需要使用HDR技術。當你使用外部光源照亮暗部物體時,也一定要保持手持平穩或使用三腳架。

二.HDR技術方案

  1. HDR渲染步驟

1)將整個場景渲染到一張浮點紋理上(16bit或32bit都可以);

2)色調映射(Tone Mapping);

3)渲染泛光(Bloom)效果;

4)將泛光和色調映射的結果進行疊加。

第一步很簡單,只需要硬件支持浮點紋理即可,比較重要的是本文重點介紹的2、3兩步,最後將2、3兩步的結果進行疊加,形成最終效果圖。

【顯示設備上[0, 255]的亮度範圍在着色器程序中使用[0, 1]的浮點數表示,下文的亮度和顏色值表示均使用着色器程序的標準。在算法中都用到了亮度的計算,每個像素的亮度的計算方法是L=0.27R+0.62G+0.06B】

  1. 色調映射

色調映射是在有限動態範圍媒介上近似顯示高動態範圍圖像的技術。對於人眼來說也有類似的映射方式,因爲人眼對亮度的感知範圍遠低於自然界的亮度範圍,只能感知到某個範圍內的光照。和顯示設備不同的是,人眼對光的感知範圍是動態變化的,例如從光亮的室外環境突然走入一個黑暗的室內環境,剛剛開始一片漆黑,過一會兒纔可以看清周圍環境,人眼的這個調節過程叫做光適應(Light Adaptation)。所以要模擬出真實的光照效果,除了表現出合適的光照,還需要模擬出人眼對光線的調節過程。

最簡單的色調映射是將亮度超過1的值置爲1,這種做法會出現文章開始提到的牆壁和陽光一樣亮的問題;另一種簡單的色調映射是將每個像素的除以最高亮度像素的亮度值,可以很好的將所有像素的亮度映射到[0, 1]之間,這種方法會導致場景中某些特別亮的像素會導致場景中的其他部分特別暗。比較好的方式是採用平均亮度值進行調節,由於平均亮度值反映了場景中的整體亮度,所以受到場景中少部分過亮或過暗的像素影響不大。

2.1 計算平均亮度

計算平均亮度的公式爲:

在這裏插入圖片描述

該公式先對亮度取對數,平均後再進行冪運算。之所以不是直接對亮度平均,而是取了對數,是爲了防止過亮的像素對整體造成的影響過大,該公式來源於參考文獻1。

計算平均亮度的最簡單的方法是遍歷所有像素,用上述公式求平均值。該方法需要CPU完成,效率不高,DirectX的“HDRLighting”例子採用了一種基於GPU加速的方法,利用像素着色器多次DownSampling,最後求得平均值,具體流程如下:

1)首先將場景渲染到紋理中,在此基礎上,對該紋理取樣並計算相應像素亮度的ln()值並進行平均(相當於上述公式去掉exp),存入64*64的紋理中;

2)對上一步的紋理44 DownSampling,生成1616的紋理;

3)對上一步的紋理44 DownSampling,生成44的紋理;

4)對上一步的紋理44 DownSampling,生成11的紋理,並計算其exp()值。

最後生成的1*1的紋理中的像素爲公式中要求的平均亮度Lavg。

2.2 光適應

爲了模擬人眼對於不同光強會自動調節適應範圍的效果,只需要對這一幀求出的平均亮度Lavg與上一幀的平均亮度Lavg進行插值即可,當然這個插值不是線性插值,“HDRLighting”中的代碼如下:

float fNewAdaptation = fAdaptedLum + (fCurrentLum - fAdaptedLum) * ( 1 - pow( 0.98f, 30 * g_fElapsedTime ) );

其中,fAdaptedLum爲上一幀的Lavg,fCurrentLum爲當前幀的Lavg,g_fElapsedTime爲當前幀和上一幀的時間間隔,fNewAdaptation爲最終Lavg的計算結果。

2.3 計算縮放因子

場景的整體亮度可以通過縮放因子進行調節,公式如下:

在這裏插入圖片描述

其中Lscale(x,y)是當前像素的亮度值。Key是一個常數,Key 的大小決定了映射後場景的整體明暗程度,一般取0.18(在伽馬校正理論中,0.18經過校正後大概是0.5,也就是我們感官上的中等灰度級)。Key值的選擇可以看作攝像機的曝光程度,我們可以使用這個公式控制自由的攝像機的曝光程度,Key越大整個場景就顯得越白。一般來說,高曝光的Key最高爲0.72,低曝光的Key最低爲0.045,一般程度的曝光Key選擇0.18附近的值。

2.4 歸一化處理

到此爲止,色調映射已經基本完成,剩下的只需要將Lscale(x,y)映射到[0, 1]範圍內即可,公式如下:

在這裏插入圖片描述

其中其中Color(x,y)是當前像素的顏色值。

  1. 渲染泛光效果

泛光是一種光學效應,它是指在來自於強光源的光線看起來像是影響到了周圍物體。想象一間房間,窗戶外面陽光明媚,若往窗外看去,感覺窗戶光亮的邊緣有一圈模糊,這就是泛光效果。在遊戲中適當的增加泛光效果,能夠增強畫面的真實感。

渲染泛光效果的思路很簡單,主要分爲兩個步驟,第一步是使用bright-pass filter提取出場景中高亮部分,第二步對高亮部分進行模糊處理。"HDRLighting"中bright-pass filter的代碼如下:

1 // Determine what the pixel’s value will be after tone mapping occurs

2 vSample.rgb *= g_fMiddleGray/(fAdaptedLum + 0.001f);

3

4 // Subtract out dark pixels

5 vSample.rgb -= BRIGHT_PASS_THRESHOLD;

6

7 // Clamp to 0

8 vSample = max(vSample, 0.0f);

9

10 // Map the resulting value into the 0 to 1 range. Higher
values for

11 // BRIGHT_PASS_OFFSET will isolate lights from
illuminated scene

12 // objects.

13 vSample.rgb /=
(BRIGHT_PASS_OFFSET+vSample);

第二步則是對第一步的結果進行模糊,首先對第一步的結果進行22或44的downsampling,再使用2*2的高斯核心對其進行模糊。其中先對圖像downsampling再模糊的做法是利用GPU進行圖像模糊的一種提高性能的方法,因爲downsampling後圖像分辨率降低了,計算量自然就少了;而downsampling後的圖片再放大,本身又是一種模糊,可以減少高斯模糊的採樣數量。最終效果如圖2所示

在這裏插入圖片描述

圖4. 圖片來源於微軟DirectX SDK中“HDRLighting”例子,左圖爲過度曝光的場景,中間圖片爲bright-pass filter處理後的結果,右圖爲模糊之後的效果

  1. 融合

現在需要將色調映射的圖像與泛光的圖像進行融合。在融合操作中除了常見的α融合外,還有一種疊加(Additive Blending)操作,它可以將兩種顏色的值進行加法操作,通常會使得顏色越變越白,這正是我們所要的效果。將色調映射的圖像與泛光的圖像進行疊加操作,即可生成最終圖像。

  1. 最終效果

“HDRLighting”中LDR和HDR的效果對比如圖3所示。

在這裏插入圖片描述

圖5. “HDRLighting”中LDR和HDR的效果對比,左圖爲LDR,右圖爲HDR

其他的一些HDR渲染效果如圖4-7所示。圖4中很明顯的觀察到汽車窗戶的鏡面光,圖5中藍色的燈光顯得比較亮,但是暗的地方也很清晰;圖6和圖7來自遊戲“孤島危機”,效果相當不錯,其中就有HDR的功勞(當然要做到這樣的畫質,HDR只是冰山一角)。圖6場景明暗得當,透過樹葉可以看到天空略微模糊;圖7中可以看到爆炸產生的碎片以及車上的顯示屏有泛光效果,充分體現了亮度的差別,而這些細節讓遊戲更加逼真。

在這裏插入圖片描述

圖6. Unity3D文檔中的HDR渲染效果圖1

在這裏插入圖片描述

圖7. Unity3D文檔中的HDR渲染效果圖

在這裏插入圖片描述

圖8. “孤島危機”截圖1
在這裏插入圖片描述
圖9. “孤島危機”截圖2

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