高动态范围成像(High Dynamic Range Imaging, HDR)是计算机视觉与计算摄影领域的核心技术之一,解决当场景中最亮区域与最暗区域的亮度跨度超过相机单次曝光的记录能力时,如何同时保留亮部与暗部的有效信息的问题。
OpenCV官方HDR模块涵盖曝光对齐→相机响应函数标定→HDR合成→色调映射的完整管线,同时也提供了无需构建辐射图的曝光融合(Exposure Fusion)技术路线。
一、为什么单次曝光无法覆盖大亮度跨度场景
1.1 亮部过曝与暗部欠曝的本质
在典型工业场景中,如金属加工、焊接检测、激光定位等,往往同时存在极强的镜面反光、高亮电弧/激光,以及工件内部、夹具阴影等极暗区域,场景的最大亮度 LmaxL_{\text{max}}Lmax 与最小亮度 LminL_{\text{min}}Lmin 的比值可达 100000:1 甚至更高。
而相机单次曝光能够有效记录的亮度范围是有限的,必须通过选择曝光时间 ttt 进行权衡:
- 短曝光:亮区不会饱和,但暗区接收的光子数过少,信号被噪声淹没,呈现接近纯黑的状态;
- 长曝光 :暗部细节清晰可见,但高亮区域的像素达到传感器饱和上限,所有超过阈值的亮度都被记录为同一个最大值,即饱和裁切(Clipping)。
饱和最关键的特性是:后期将饱和的灰度值调暗,无法恢复真实亮度的差异。例如8位图像中,真实光强为300、600、3000的像素都会被记录为255,信息在采集阶段已经永久丢失。
1.2 从CMOS像素看成像的物理边界
一个像素在曝光期间接收光子,经过光电二极管转换为光电子,再经过模拟增益、ADC采样最终得到数字灰度值(DN)。
在线性工作范围内,这一过程可以近似为:
DN=K⋅Ne+B DN = K \cdot N_e + B DN=K⋅Ne+B
其中:
- NeN_eNe 为光电子数量,与场景辐照度 E 和曝光时间 t 成正比,即 N_e = kEt ;
- KKK 为系统增益;
- BBB 为黑电平(Black Level)。
像素的动态范围存在明确的物理上下界:
(1)饱和上限:满阱容量
像素光电二极管能够存储的光电子数量存在物理上限,称为满阱容量(Full Well Capacity / Saturation Capacity) Ne,maxN_{e,\text{max}}Ne,max。当 Ne≥Ne,maxN_e \geq N_{e,\text{max}}Ne≥Ne,max 时,像素进入饱和状态,无论真实光照强度是10000还是1000000,最终都输出相同的最大DN值。这决定了HDR成像的亮度上限。
(2)噪声基底:动态范围的下界
暗部细节不可见并非因为DN值为0,而是因为信号被噪声淹没。成像系统的主要噪声包括光子散粒噪声、读出噪声、暗电流噪声、量化噪声等,总噪声方差为:
σ2=σshot2+σread2+σdark2+σquant2+⋯ \sigma^2 = \sigma_{\text{shot}}^2 + \sigma_{\text{read}}^2 + \sigma_{\text{dark}}^2 + \sigma_{\text{quant}}^2 + \cdots σ2=σshot2+σread2+σdark2+σquant2+⋯
其中光子散粒噪声遵循泊松统计,满足 σshot≈Ne\sigma_{\text{shot}} \approx \sqrt{N_e}σshot≈Ne 。因此信噪比可表示为:
SNR≈NeNe+σread2+⋯ SNR \approx \frac{N_e}{\sqrt{N_e + \sigma_{\text{read}}^2 + \cdots}} SNR≈Ne+σread2+⋯ Ne
工业相机领域的EMVA 1288标准将动态范围定义为饱和容量 与绝对灵敏度阈值 的比值,其中绝对灵敏度阈值对应信噪比SNR=1时的信号水平。因此,动态范围的本质可以概括为:
DR=最大可靠信号最小可靠信号 \boxed{DR = \frac{\text{最大可靠信号}}{\text{最小可靠信号}}} DR=最小可靠信号最大可靠信号
1.3 动态范围的量化表达:dB、Stops与位深的辨析
(1)动态范围的单位与换算
动态范围可以表示为最大与最小可测辐照度的比值:
DR=EmaxEmin DR = \frac{E_{\text{max}}}{E_{\text{min}}} DR=EminEmax
在工程中,常用分贝(dB)和曝光档(Stop/EV)两种单位来表达:
- 分贝(dB) :EMVA 1288标准规定的表达方式,定义为 DRdB=20log10(DR)DR_{\text{dB}} = 20\log_{10}(DR)DRdB=20log10(DR)。例如DR=1000对应60dB。
- 曝光档(Stop) :摄影与HDR领域常用单位,每增加1stop代表亮度范围翻倍,即 DRstop=log2(DR)DR_{\text{stop}} = \log_2(DR)DRstop=log2(DR)。例如DR=1024对应10 stops。
两者的换算关系为:
1 stop≈6.02 dB \boxed{1\ \text{stop} \approx 6.02\ \text{dB}} 1 stop≈6.02 dB
例如120dB的动态范围大约对应20 stops。
(2)位深 ≠ 动态范围
位深(Bit Depth)描述的是数字量化精度 ,例如12bit ADC意味着输出有4096个数字码值;而动态范围描述的是最大可靠信号与最小可靠信号之间的物理范围。
对于一个12bit相机,0~ 20DN可能基本都是噪声,4000 ~4095DN接近饱和,实际有效动态范围远小于4096:1。反之,通过多增益、多曝光等HDR技术,传感器的物理动态范围也可以大于单次ADC码宽的表达范围。因此结论是:
HDR≠高位深 \boxed{\text{HDR} \neq \text{高位深}} HDR=高位深
二、经典多曝光HDR:从多张LDR图像恢复真实辐射场
2.1 Debevec-Malik 经典算法框架
Debevec与Malik提出的算法是多曝光HDR的理论基石,其流程包括相机响应函数标定与辐射图恢复两个步骤。
(1)相机响应函数(CRF)
相机输出的数字灰度值 ZZZ 与场景辐照度和曝光时间的乘积 EtEtEt 之间并非简单的线性关系,而是存在一个非线性映射函数:
Z=f(Et) \boxed{Z = f(Et)} Z=f(Et)
这个函数 fff 就称为相机响应函数(Camera Response Function, CRF)。
对于RAW格式的线性图像,CRF近似线性;而经过ISP处理的JPEG图像,由于Gamma、色调曲线、白平衡等处理,CRF呈现强非线性。因此使用JPEG进行严格的辐射度HDR重建,复杂度远高于线性RAW图像。
(2)数学推导
假设拍摄了 jjj 张不同曝光时间的图像,第 jjj 张图在像素 iii 处的灰度为 ZijZ_{ij}Zij,对应曝光时间为 Δtj\Delta t_jΔtj,场景在该像素的真实辐照度为 EiE_iEi,则有:
Zij=f(EiΔtj) Z_{ij} = f(E_i \Delta t_j) Zij=f(EiΔtj)
定义 g=lnf−1g = \ln f^{-1}g=lnf−1,对等式两边取对数可得:
g(Zij)=lnEi+lnΔtj \boxed{g(Z_{ij}) = \ln E_i + \ln \Delta t_j} g(Zij)=lnEi+lnΔtj
变形后得到辐照度的计算式:
lnEi=g(Zij)−lnΔtj \boxed{\ln E_i = g(Z_{ij}) - \ln \Delta t_j} lnEi=g(Zij)−lnΔtj
这是经典HDR重建的核心公式。Debevec与Malik通过加入平滑约束,同时求解出相机响应函数 ggg 和各像素对应的对数辐照度 lnEi\ln E_ilnEi。
(3)权重函数设计
由于极暗区域信噪比低、极亮区域接近饱和,这两类像素的可靠性都较差。因此经典算法采用三角形权重函数,对中间灰度赋予更高权 重:
w(z)={z−Zmin,z≤ZmidZmax−z,z>Zmid w(z)= \begin{cases} z-Z_{\min}, & z \le Z_{\mathrm{mid}} \\ Z_{\max}-z, & z > Z_{\mathrm{mid}} \end{cases} w(z)={z−Zmin,Zmax−z,z≤Zmidz>Zmid
其中
Zmid=Zmin+Zmax2 Z_{\mathrm{mid}}=\frac{Z_{\min}+Z_{\max}}{2} Zmid=2Zmin+Zmax
权重曲线呈中间高、两端低的三角形状,确保最终合成结果主要由可靠的中间灰度像素贡献

2.2 HDR辐射图的生成与存储格式
得到相机响应函数后,每个像素的辐照度通过加权平均计算:
lnEi=∑jw(Zij)g(Zij)−lnΔtj∑jw(Zij) \ln E_i = \frac{\sum_j w(Z_{ij}) \left g(Z_{ij}) - \\ln \\Delta t_j \\right}{\sum_j w(Z_{ij})} lnEi=∑jw(Zij)∑jw(Zij)g(Zij)−lnΔtj
最终通过指数运算得到真实辐照度 EiE_iEi。
HDR辐射图的像素值不再是0~255的整数,而是可以表达极大亮度范围的浮点数,因此通常使用32位浮点格式存储。常见的HDR文件格式包括:
- Radiance
.hdr格式 - OpenEXR
.exr格式
经过HDR处理后导出的JPG/PNG图像本质上已经是LDR图像,并非真正的HDR辐射数据。
2.3 另一条技术路线:曝光融合(Exposure Fusion)
很多人将OpenCV中的 cv::MergeMertens 也称为HDR,但严格来说并不准确。Mertens等人提出的曝光融合(Exposure Fusion)方法,其核心思想是直接从多曝光LDR图像融合生成一幅视觉效果良好的LDR图像,而不先恢复物理意义上的HDR辐射图。
该算法根据三个指标计算不同曝光图像中每个像素的权重:
- 对比度(Contrast):局部对比度越高,权重越大;
- 饱和度(Saturation):颜色越丰富,权重越大;
- 曝光适宜度(Well-exposedness):像素不过暗也不过亮,权重越大。
最终权重为三个指标的加权乘积:
Wij=CijωC⋅SijωS⋅EijωE W_{ij} = C_{ij}^{\omega_C} \cdot S_{ij}^{\omega_S} \cdot E_{ij}^{\omega_E} Wij=CijωC⋅SijωS⋅EijωE
融合过程采用拉普拉斯金字塔(Laplacian Pyramid)多分辨率融合,而非简单的逐像素加权,避免出现拼接痕迹。
2.4 辨析:Debevec HDR vs Mertens 曝光融合
| 维度 | Debevec HDR | Mertens 曝光融合 |
|---|---|---|
| 多曝光输入 | 是 | 是 |
| 需要已知曝光时间 | 是 | 否 |
| 估计相机响应函数 | 是 | 不需要 |
| 恢复场景辐射场 | 是 | 否 |
| 输出数据类型 | HDR浮点数据 | LDR图像 |
| 需要色调映射 | 是 | 通常不需要 |
| 物理意义 | 强,支持定量测量 | 弱,面向视觉效果 |
| 视觉效果 | 需要后处理优化 | 往往直接输出较好效果 |
简单来说:如果目标是得到一张视觉美观的照片,曝光融合简单高效;如果目标是保留真实辐照度信息、用于后续定量测量与算法计算,则必须采用真正的HDR辐射重建。
三、色调映射(Tone Mapping):HDR到显示端的桥梁
3.1 为什么必须做色调映射
HDR辐射图的亮度范围可能达到0.001 ~ 10000甚至更高,而普通SDR显示器只能显示0~255的8位灰度范围,无法直接呈现如此大的动态范围。因此需要色调映射算子(Tone Mapping Operator, TMO) 将HDR数据压缩到可显示的LDR范围。
OpenCV官方对Tone Mapping的定义是:将HDR图像映射到普通8位显示范围的算法。其目标是:
- 压缩整体动态范围以适配显示设备
- 尽量保留局部对比度与细节
- 尽量保持视觉自然性
3.2 全局色调映射(Global TMO)
全局色调映射对整幅图像使用同一个映射函数,计算简单、速度快、稳定性高,但大动态范围压缩后可能损失局部细节。
(1)Gamma校正
最简单的色调映射方式是Gamma校正:
Lout=Lin1/γ L_{\text{out}} = L_{\text{in}}^{1/\gamma} Lout=Lin1/γ
常用的Gamma值约为2.2。但Gamma只是一种非线性亮度变换,并非完整的HDR色调映射理论,对于极大的动态范围压缩能力有限。
(2)Reinhard色调映射
首先计算场景的对数平均亮度 Lˉ\bar{L}Lˉ,然后通过关键值 aaa 对亮度进行缩放:
Lm=aLˉL L_m = \frac{a}{\bar{L}} L Lm=LˉaL
最终通过S型函数压缩到0~1范围:
Ld=Lm1+Lm \boxed{L_d = \frac{L_m}{1+L_m}} Ld=1+LmLm
当亮度很低时,映射近似线性;当亮度极高时,输出趋近于1,从而实现大动态范围的压缩。
(3)Drago色调映射
Drago算法采用自适应对数映射,特点是计算速度快,适合对实时性要求较高的场景。
3.3 局部色调映射(Local TMO)与对比度处理
局部色调映射的映射函数不仅依赖当前像素的亮度,还依赖其邻域像素的亮度特性,模拟人眼"暗环境提高暗区感知、亮环境降低亮区响应"的视觉特性。
局部TMO的优势在于暗部与高光细节丰富、局部对比度好,但也容易产生光晕(Halo)、非自然对比度、噪声放大、视频闪烁等问题。
Mantiuk等人的工作从人类视觉系统、梯度与多尺度对比度的角度研究HDR对比度处理,是局部色调映射领域的经典代表。
3.4 常见TMO算法对比与选型
OpenCV官方HDR模块提供了四种主流TMO实现,其特点对比如下:
| 算法 | 核心思路 | 特点 |
|---|---|---|
| Gamma | 幂函数变换 | 实现简单,压缩能力有限 |
| Drago | 自适应对数压缩 | 速度快,适合实时场景 |
| Reinhard | 摄影曝光模型 | 视觉效果自然,通用性强 |
| Mantiuk | 感知驱动的多尺度对比度处理 | 细节丰富,适合高画质需求 |
需要特别强调的是:色调映射 ≠ HDR采集。Tone Mapping只是对已有信息的重新表达,无法恢复采集阶段已经丢失的饱和信息;同时,经过非线性色调映射后的图像,不适合用于辐照度、反射率等定量测量。
四、运动挑战与传感器级HDR技术
多曝光HDR需要依次拍摄多张不同曝光的图像,这一特性在动态场景中会引入严重的运动伪影,也是工业视觉应用中必须解决的核心问题。
4.1 多曝光HDR的天生缺陷:运动鬼影
多曝光HDR假设场景在拍摄多张图像的过程中保持静止。如果相机或场景中的物体发生运动,不同曝光图像中的物体位置会发生偏移,合成后就会出现重影,称为鬼影(Ghosting)。
对于工业场景中的机械臂运动、输送带运转、焊接熔池变化、烟尘流动等动态目标,普通多帧HDR的鬼影问题会非常严重。
4.2 曝光对齐:MTB算法的原理与局限
为了缓解相机整体运动带来的错位,多曝光HDR首先需要进行图像对齐(Registration)。OpenCV提供了 cv::AlignMTB 算法,即中值阈值位图(Median Threshold Bitmap)。
MTB的思想是避免直接比较不同曝光下的灰度值:先根据图像中值构建二值图,大于中值的像素标记为1,否则标记为0;再通过二值图的匹配进行图像对齐。这种方法比直接灰度差匹配更能抵抗曝光差异。
但MTB只能解决相机整体平移、旋转等全局运动,无法解决场景内部物体的相对运动,更无法消除不同曝光时刻场景状态变化带来的伪影。
4.3 传感器内置HDR方案
为了解决多曝光HDR的运动问题,CMOS厂商将HDR机制集成到传感器内部,在单帧时间内完成多通道曝光与合成,大幅降低运动伪影。常见的技术路线包括:多曝光交错、双增益、多转换增益、分割像素、非线性响应等,其本质都是让亮区使用不易饱和的测量通道,暗区使用高灵敏度的测量通道。
(1)DOL HDR:分时双曝光的传感器实现
索尼的DOL(Digital Overlap)HDR是传感器级多曝光HDR的典型代表。其工作原理是连续采集一幅短曝光图像(负责亮区)和一幅长曝光图像(负责暗区),然后在传感器内部进行合成。
DOL HDR本质上和传统包围曝光HDR原理完全一致,只是实现位置更靠近传感器,速度更快。但由于两次曝光之间仍然存在微小的时间差 Δt\Delta tΔt,快速运动的目标仍然可能出现边缘错位、重影、轮廓模糊等伪影。
(2)Dual-Gain HDR:同时双增益的动态优势
双增益(Dual-Gain)HDR采用完全不同的技术思路:同一个光电二极管产生的光信号,同时分为两路,一路用低增益读取(覆盖亮区),一路用高增益读取(覆盖暗区),再进行合成。
索尼的Clear HDR技术就采用这一架构,其最大的优势在于两路读取几乎同时完成,时间差 Δt≈0\Delta t \approx 0Δt≈0,因此动态目标的运动伪影大幅减轻,非常适合高速工业视觉场景。
4.4 运动伪影的本质与方案选型
- 对于静态或低速运动场景,传统多曝光HDR配合对齐算法可以满足需求,且成本较低;
- 对于中高速运动场景,优先选择DOL HDR等传感器级多曝光方案;
- 对于高速运动、对伪影零容忍的场景,Dual-Gain等同时读取型HDR是最优选择。
五、工业视觉中的HDR
HDR在工业视觉中的价值与消费摄影有本质区别:摄影追求"看起来好看",而工业视觉追求"测量准确"。这一核心差异决定了工业场景下HDR的选型、使用与评价标准。
5.1 概念区分
(1)HDR ≠ 提高增益(Gain)
这是工业视觉中最常见的误解。提高模拟增益确实可以让暗部变亮,但信号和噪声会被同时放大,同时亮部更容易饱和,反而会缩小动态范围。
增益改变的是输出信号的幅度,而HDR扩大的是最大可测信号与最小可测信号的比值 。
Gain≠Dynamic Range \boxed{\text{Gain} \neq \text{Dynamic Range}} Gain=Dynamic Range
(2)HDR ≠ 对比度增强
对比度增强(如直方图均衡化、CLAHE、Retinex等)是对已有图像的灰度拉伸,只能重新分配已有的灰度值,无法恢复采集阶段已经饱和丢失的信息。
例如原图中所有饱和的255像素,经过对比度增强后仍然是255,亮部细节并没有真正恢复。因此:
Contrast Enhancement≠HDR acquisition \boxed{\text{Contrast Enhancement} \neq \text{HDR acquisition}} Contrast Enhancement=HDR acquisition
(3)HDR ≠ Retinex
Retinex理论基于"图像=反射率×光照"的模型,目标是估计并削弱光照的影响,强调物体的反射率特性,可以实现暗部增强与局部对比度提升。但如果CMOS在曝光时已经饱和,Retinex同样无法恢复真实的亮部信息。
两者的本质区别在于:
- HDR采集:获取更多真实信息
- Retinex/色调映射:重新表达已有信息
5.2 工业视觉的典型HDR场景
(1)金属件检测
金属表面的镜面反射与工件暗部阴影往往同时存在,亮度跨度极大,普通曝光极易出现反光区域饱和裁切。HDR可以显著降低镜面反射导致的信息丢失,提升边缘、缺陷的可检测性。
(2)激光视觉测量
线激光、点激光等场景中,激光线本身极亮,而背景很暗。普通长曝光会导致激光饱和变宽,影响中心定位精度;短曝光则背景完全不可见。HDR可以同时保留激光线条的精度与背景的可见性,扩大系统的兼容范围。
需要注意的是,对于激光中心提取任务,窄带滤光片、合适的曝光参数、光功率控制、全局快门等手段往往比单纯依赖色调映射更有效。
(3)焊接视觉检测
焊接场景包含极亮的电弧、高亮的熔池、中等亮度的工件,以及极暗的坡口区域,亮度跨度非常大,是最典型的HDR应用场景。
焊接视觉的最优方案通常是HDR传感器+光学滤光+窄带主动照明+合理曝光策略的组合,而不是只在ISP后端做HDR处理。
5.3 EMVA 1288:工业相机的客观评价标尺
工业相机厂商往往都会标注动态范围参数,但不同厂商的测试条件、阈值定义、增益设置、ISP处理各不相同,参数之间不具备直接可比性。
EMVA 1288是欧洲机器视觉协会制定的统一标准,定义了量子效率、增益、读出噪声、饱和容量、绝对灵敏度阈值、信噪比、动态范围等核心参数的测量、计算与展示方法,使不同设备的性能可以客观对比。
EMVA 1288 Release 4.0还增加了General模型,可以表征非线性响应或存在未知预处理的相机,不再局限于理想线性RAW相机。在选型工业相机时,提供EMVA 1288合规数据表的厂商,通常比只提供宣传参数的更加可靠。
5.4 工程落地的原则:光学优先,算法兜底
机器视觉系统是相机、镜头、光源、被测物与算法的综合体,HDR只是其中的技术手段之一。对于高反光、大亮度差场景,能用光学手段解决的问题,不要全靠HDR算法。
优先考虑的光学手段包括:
- 调整光源角度:避免镜面反射进入镜头
- 偏振方案:通过偏振片与交叉偏振削弱镜面反射
- 漫射照明:使用穹顶光、同轴光、漫射光改善亮度均匀性
- 窄带滤光片:抑制环境光干扰
- 高满阱容量传感器:从硬件层面扩大单帧动态范围
这些光学手段的稳定性与可靠性通常优于后端的HDR算法处理。
5.5 HDR工程中的常见踩坑点
坑1:未关闭自动曝光
拍摄多曝光图像时,如果相机的自动曝光(AE)、自动增益、自动白平衡等功能开启,相机会自行修改增益、Gamma、黑电平等参数,破坏HDR模型的假设。正确做法是固定增益、光圈、白平衡、Gamma、ISP等所有参数,仅改变曝光时间。
坑2:使用处理过的JPEG做物理HDR
JPEG图像经过Gamma、色调曲线、色彩矩阵、降噪、锐化、压缩等一系列处理,数字值与光子数不再呈线性关系。严格的辐射度HDR重建必须使用线性RAW数据。
坑3:曝光之间出现运动
场景内部的物体运动、状态变化会导致鬼影与模糊。此时应优先考虑单帧传感器级HDR方案,而非多帧合成HDR。
坑4:曝光跨度太小
如果多组曝光时间过于接近(如10ms、11ms、12ms),覆盖的亮度范围几乎重叠,HDR收益非常有限。通常曝光序列按几何级数设置,如 t,2t,4t,8tt, 2t, 4t, 8tt,2t,4t,8t,对应摄影中的-2EV、0EV、+2EV,效果更显著。
坑5:曝光跨度太大且无重叠区
如果最短曝光与最长曝光之间差距过大,且没有中间曝光过渡,两者缺乏足够的辐射度重叠区域,会导致相机响应函数估计与HDR重建不稳定。不同曝光之间需要保留一定的有效重叠区间。
坑6:将色调映射后的图像用于阈值标定
启用HDR、WDR、自动色调映射等功能后,DN值与真实辐照度之间的映射关系会发生变化。原来标定的阈值物理意义完全改变,必须重新验证算法的标定参数。
5.6 HDR、WDR、EDR的名称辨析
厂商经常使用HDR、WDR、EDR等不同术语,名称并不完全统一:
- HDR(High Dynamic Range):泛指高动态范围成像;
- WDR(Wide Dynamic Range):监控与工业相机领域常用叫法,可通过多曝光、双增益、传感器HDR等多种方式实现;
- EDR(Extended Dynamic Range):通常是厂商对"扩展动态范围"的描述。
六、HDR管线与OpenCV代码实现
6.1 经典HDR重建全流程
经典HDR成像管线如下:
场景辐照
↓
多曝光LDR图像采集(t1, t2, t3...)
↓
曝光对齐(Alignment)
↓
相机响应函数标定(CRF Calibration)
↓
逆响应映射与辐射度恢复
↓
HDR辐射图(float32)
↙ ↘
机器视觉分析 色调映射(Tone Mapping)
│ ↓
│ 可显示LDR图像
↓
定量测量与算法处理
OpenCV官方HDR API与这一流程完全对应,同时提供了曝光融合的简化路线。
6.2 OpenCV C++实现示例
(1)Debevec HDR + Tone Mapping 完整管线
以下代码实现了从多曝光图像输入,到相机响应函数标定、HDR辐射图合成、Reinhard色调映射的完整流程:
cpp
#include <opencv2/opencv.hpp>
#include <opencv2/photo.hpp>
#include <vector>
int main()
{
// 1. 加载多曝光图像
std::vector<cv::Mat> images;
images.push_back(cv::imread("short.png"));
images.push_back(cv::imread("middle.png"));
images.push_back(cv::imread("long.png"));
// 2. 对应曝光时间(秒)
cv::Mat times = (cv::Mat_<float>(3, 1)
<< 1.0f / 1000.0f,
1.0f / 100.0f,
1.0f / 10.0f);
// 3. 标定相机响应函数
cv::Mat response;
auto calibrate = cv::createCalibrateDebevec();
calibrate->process(images, response, times);
// 4. 合成HDR辐射图
cv::Mat hdr;
auto merge = cv::createMergeDebevec();
merge->process(images, hdr, times, response);
// 5. Reinhard色调映射生成可显示LDR图像
cv::Mat ldr;
auto tonemap = cv::createTonemapReinhard();
tonemap->process(hdr, ldr);
// 6. 保存结果
cv::imwrite("hdr_radiance.exr", hdr); // 保存HDR辐射图
cv::imwrite("display_result.png", ldr * 255.0f); // 保存可显示图像
return 0;
}
(2)Mertens曝光融合快速实现
如果只需要视觉效果良好的融合图像,可以直接使用Mertens曝光融合,无需已知曝光时间与相机响应函数:
cpp
auto merge = cv::createMergeMertens();
cv::Mat result;
merge->process(images, result);
cv::imwrite("fusion_result.png", result * 255.0f);
OpenCV官方明确说明,Mertens曝光融合不需要输入曝光时间,输出结果已经处于适合显示的范围,无需额外的色调映射步骤。但必须清楚:这不是辐射度准确的HDR,不适合用于定量测量。
总结
text
HDR Imaging
│
┌──────────────────┼─────────────────┐
│ │ │
采集层 重建层 显示层
(Acquisition) (Reconstruction) (Display)
│ │ │
│ │ │
多曝光合成 曝光对齐 色调映射
DOL HDR CRF标定 Reinhard
双增益HDR Debevec算法 Drago
分割像素 Robertson算法 Mantiuk
低噪声传感器 去鬼影算法 Gamma
高满阱容量
│ │ │
▼ ▼ ▼
获取更多真实信息 恢复真实辐射场 压缩适配人眼观看
HDR技术的本质可以用一句话概括:
扩大可测光强范围⏟∗传感器 / 多曝光→恢复场景Radiance⏟∗HDR重建→压缩到显示范围⏟色调映射 \boxed{ \underbrace{\text{扩大可测光强范围}}*{\text{传感器 / 多曝光}} \rightarrow \underbrace{\text{恢复场景Radiance}}*{\text{HDR重建}} \rightarrow \underbrace{\text{压缩到显示范围}}_{\text{色调映射}} } 扩大可测光强范围∗传感器 / 多曝光→ 恢复场景Radiance∗HDR重建→色调映射 压缩到显示范围
对于工业视觉而言,HDR的真正价值不在于"图片看起来更漂亮",而在于让原本因饱和而消失的亮部信息、因噪声而不可用的暗部信息,真正成为可测量、可计算的有效数据。