首先,HDR的算法通過軟件的實現方式有很多種,對於硬件(FPGA)來說,存在運算過程中要求緩存少,少乘除法運算等等的限制。基於上述考慮,主要參考早期的一篇論文: Paul E. Debevec等人的《Recovering High Dynamic Range Radiance Maps from Photographs》的算法,來完成FPGA上的HDR圖像合成。
算法的原理詳解網上很多,在opencv中也有對應這個算法的軟件實現。這里不詳述,這篇文章主要是針對FPGA上的實現。
先放效果:(matlab版本,定點化后的結果,右下角的是處理后的結果)
(該圖片涉及隱私,已刪除)
從上圖中的直方圖可以看到,處理后的直方圖分布比較均勻,明暗細節都能看清楚(室內屬於暗處,玻璃窗戶外屬於亮處)。
2. FPGA的實現。
要實現HDR的功能,最好使用帶有HDR模式輸出的cmos sensor,這種sensor在圖像輸出時會將長、中、短曝光的三幀圖像按行進行列交替輸出(即...長0...中0...短0...長1...中1...短1...這種順序輸出)。那么在FPGA內處理時,只需要進行2行數據的緩存即可,大大降低了硬件緩存的需求。 由於我使用的是黑白圖像的sensor,處理的是黑白圖像HDR,原理與上述的彩色是基本一致的。(matlab仿真結果,我將原始圖像進行了縮小,方便modelsim的圖像導入和仿真)
(該圖片涉及隱私,已刪除)
在FPGA實現的過程中,有幾個難點的地方:
第一是對sensor的響應曲線進行推算;
第二是算法中存在exp指數運算,需要特殊處理。
下圖為該HDR模塊的硬件實現的大致框圖: