HDR+算法是自己好幾年前在某手機公司接觸的項目,當時把HDR+的論文複現了下,降噪效果還是很不錯的,但是我主要用的是jpg的圖,沒用過RAW原圖,當時也隻是摸清了原理,沒有做過下位機移植。
順便說下自己的感受,感覺不管做什麼行業,一定都要有自己的想法,也就是對整個行業的把握和了解。如果沒有自己的想法,那就隻能被人牽着鼻子走,自己徹底淪為打雜的。當時我剛畢業時就是沒什麼自己的想法,讓做什麼就做什麼,其實這樣很不好的,對自己職業發展肯定是不利的。
工作幾年後,對行業有一定認識後,就需要盯着幾個方向持續追蹤,深入研究,感覺對HDR+算法還是比較有興趣的,後面還是希望能關注下多幀降噪這方面的技術,最新的論文之類的,先試着把HDR+算法做到下位機。
參加工作這幾年我主要從事的方向是圖像&計算機視覺算法,做過正常圖像算法,也做過深度學習算法,按照功能主要接觸過的類别包括檢測、識别、判斷、圖像去噪、分類、語義分割。
像檢測,識别,判斷這類算法,就是輸入一張圖,輸出檢測,識别,判斷的結果,這類算法的過程就是資訊在不斷丢失,典型的輸入資料内容比輸出多,這類算法很容易做到實時。
但是像語義分割,圖像去噪這類輸入是一張圖像,輸出是等大的圖像,輸入資料内容和輸出資料内容差不多大,甚至有些還要求圖像内容更豐富細緻。這類算法想做到實時就比較難的。可能語義分割也算是資訊丢失的過程,但是目前語義分割在一些下位機中是很難做到實時(截止2021年3月29日),一般都是需要将圖像進行縮小,網絡分割完了再放大到等大。
HDR+算法也是一種典型的像素到像素的處理算法,是以也很難做到實時,尤其是如果要處理的圖像還很大的時候。
HDR+的算法流程包括選幀,反馬賽克,對齊,融合,色調映射(Tone-Mapping)等等過程。其中每個過程都包含一些專門的算法,我主要對對齊和融合這些過程比較有興趣,另外對于融合中的一些圖塊去馬賽克效果有興趣。
不回去翻論文和貼圖了,就憑回憶簡單說下原理。
傳統HDR算法就是拍三張圖,一張欠曝,一張正常曝,一張過曝,然後對齊後融合,很容易出現鬼影,主要因為過曝光那張圖采集的時候曝光時間比較長,如果畫面中有物體在移動,或者自己手抖了,導緻三張圖差别比較大,對的不夠齊就會出現鬼影。HDR+算法運用一種幸運成像的方式,采集多張欠曝圖,論文中是8張。因為是欠曝,曝光時間短,而且是快速采集多張圖,是以幀之間的差别比較小,容易對齊。另外因為短時間曝光,不容易出現過曝死白死白的區域,整個畫面就是很暗,可以存儲更多動态範圍,後續把亮度拉一下就可以把一些死黑的區域的細節顯示出來(圖像如果過曝,細節就完全丢失)。但是短時間曝光會出現很多噪點,是以需要多張圖來進行對齊融合,均勻采樣就能把噪點消除。
以前相機的傳感器拜耳陣列的資料存儲範圍是8位,動态範圍是0到255,現在可能很多傳感器的動态範圍能到14位或者16位,可以記錄更大的動态範圍。HDR+論文裡面的RAW圖記得貌似是14位的。不過最終都會壓縮成8位的,像jpg類型的圖都是8位的。
采集完8張圖後,就會選一張圖作為底圖(這裡就涉及到選幀算法,這也是一個算法方向,如果要研究也是很多需要研究的,暫時不管)。然後其它7張圖跟這張底圖分别做7對對齊,論文裡面用到的對齊方式是4個尺度的分塊模闆比對。
先把圖像縮放成1/32,然後兩張圖各自分成16x16的塊在4x4的範圍内模闆比對。記錄下每塊移動的大小。這步允許最大偏移32x4=128個像素。
再把圖像縮放成1/8,然後兩張圖各自分成16x16的塊在4x4的範圍内模闆比對。記錄下每塊移動的大小。這步允許最大偏移8x4=32個像素。
再把圖像縮放成1/4,然後兩張圖各自分成16x16的塊在2x2的範圍内模闆比對。記錄下每塊移動的大小。這步允許最大偏移4x2=8個像素。
最後在原圖上 ,兩張圖各自分成16x16的塊在1x1的範圍内模闆比對。記錄下每塊移動的大小。這步允許最大偏移1x1=1個像素。
一共最大允許128+32+8+1 = 169個像素的偏移。對齊完後,就會對對應的塊按照一定比例進行融合。
比如以第一張圖為底圖,那其它7張圖跟第一張圖對應塊會先做差,然後差的倒數作為對應塊融合時的比例系數,而第一張圖作為底圖,其比例系數為1。也就是8張圖對應塊的比例系數為:
1:1/Ires1:1/Ires2:1/Ires3:1/Ires4:1/Ires5:1/Ires6:1/Ires7
如果對應塊跟原圖相差的越多,比例系數就越低,因為這個時候可能就是對齊錯誤。如果跟原圖差的越小,比例系數會越大,這個時候就相當于每張圖對應塊都會取一部分均勻融合,不同幀的欠曝光畫面形成的噪點分布是随機均勻分布(其實不是很确定是否是均勻随機分布,也有可能是泊松分布,暫時沒研究過,但是确認肯定不是固定分布的),這樣多張圖再均勻融合,很多噪點就相當于抵消了。
下面兩張gif圖是我跑出來的結果截圖,當然在這個場景下,8張圖在采集的時候移動的幅度不大,是以出現對齊錯誤的比較少。

8張圖中的同一個物體如果偏移169個像素以上,會出現無法對其,或者就是對齊錯誤的現象。這時畫面就會出現一些很明顯的馬賽克或者圖塊的現象。貌似論文中沒有提到這個的解決方法,也可能是我當時沒注意到這塊而被我忽視了。前段時間思考了下,想到了一些解決辦法,打算先按照自己的想法嘗試下,後面再翻翻論文找找有沒有這個的處理。後面更新本篇博文時再詳細介紹下我的想法吧。
論文中還有很多算法我沒說到。比如色調映射,還有那個欠曝光的時間怎麼确定。既使是欠曝光,不同場景欠曝的時間肯定也不一樣。記得當時看論文好像是谷歌采集了很多不同的場景圖,貌似是有5000多個不同的場景,然後每個場景調了些合适的曝光時間,計算了一些參數,然後後續實際拍照時會做比對,比對上類似的場景就借鑒這個已有場景的曝光時間。貌似他們色調映射也是這麼做的,因為色調映射也是需要針對不同的場景去調的。
總的來說這個HDR+算法涉及到的算法還是很多的,感覺每個子產品如果感興趣都有很多得去研究的。它是很多子產品都做的很好,最後才實作了很好的效果,畢竟那個論文也不是一個人做出來的,貌似論文作者都挂了好幾個人的名字的。
先介紹這麼點挖個坑把,後面再把實驗的過程圖和代碼貼上來吧~