HDR¶
HDR 模块当前提供一个静态 Linear RGB 的传统融合 baseline,用作 Open-AISP 管线中的“Oracle Baseline”。它不包含深度学习、噪声建模或运动对齐,只验证在完美静态条件下,多曝光物理信息能否被正确融合。
这一版默认使用 MIT-Adobe FiveK / MIT5K 的 DNG 图像作为静态输入源。Expert A-E 的 TIFF 是 Lightroom 调色后的输出,不用于当前 HDR baseline。DeepHDR 的运动 burst 数据暂不用于当前传统 baseline,后续留给 AI-HDR 模块。
功能¶
- 读取 MIT5K DNG 图像,用
rawpy解码为 linear RGB,并按中值亮度归一化到稳定模拟空间。 - 根据输入图像的亮度分布动态估计
over、norm、under三帧曝光系数。 - 使用估计出的曝光系数模拟三帧包围曝光,并以
1.0为白点进行满阱截断。 - 使用高斯曝光置信度权重,并默认屏蔽硬截断像素。
- 将三帧图像除以曝光系数,拉回统一线性辐射空间。
- 在构建拉普拉斯金字塔前,用 direct oracle 估计填补各帧截断区域,避免错误辐射值被金字塔扩散。
- 使用权重高斯金字塔和图像拉普拉斯金字塔完成多尺度融合。
- 输出融合结果、GT、三帧模拟曝光的
.hdr文件和直接 linear RGB PNG 预览图。
运行¶
以下命令从仓库根目录运行。
pip install -r HDR-fusion/requirements.txt
python HDR-fusion/scripts/download_mit5k.py \
--ids 3
PYTHONPATH=HDR-fusion python -m hdr_fusion.cli \
--input HDR-fusion/datasets/MIT5K/dng/a0003.dng \
--output HDR-fusion/outputs/a0003_fused.hdr \
--metrics HDR-fusion/outputs/a0003_metrics.json
上述命令会在 HDR-fusion/outputs/ 中保存:
a0003_fused.hdr:融合后的 Linear HDR。a0003_fused.png:融合 HDR 结果的 Reinhard tone-mapped 可视化 PNG。a0003_gt.png:归一化 GT 的直接 linear RGB 可视化 PNG。a0003_over.hdr/png:模拟过曝帧及其可视化。a0003_norm.hdr/png:模拟正常曝光帧及其可视化。a0003_under.hdr/png:模拟欠曝帧及其可视化。a0003_weight_over.png:过曝帧融合权重图。a0003_weight_norm.png:正常曝光帧融合权重图。a0003_weight_under.png:欠曝帧融合权重图。a0003_weight_argmax.png:主导曝光来源彩色图。a0003_luminance_hist.png:over/norm/under/fused 四条亮度分布叠加直方图。a0003_metrics.json:误差指标。
常用参数:
--exposures 4.0 1.0 0.25:可选的固定三帧曝光补偿系数;省略时会根据亮度分位数自动估计。--input-color-space auto|srgb|linear:非 DNG 图像的色彩空间处理方式。--sigma 0.2:高斯曝光置信度宽度。--levels 6:金字塔层数。
验证¶
PYTHONPATH=HDR-fusion pytest HDR-fusion/tests
CLI 会输出:
l1:融合结果与归一化 GT 的全图平均绝对误差。recoverable_l1:排除连欠曝帧都会截断的不可恢复区域后的平均绝对误差。recoverable_ratio:可恢复像素占比。exposure_mode和exposure_factors:曝光挡位来自自动估计还是手动固定,以及实际使用的曝光系数。
融合 HDR 的预览图会先做 Reinhard tone mapping,再用 sRGB transfer 写入 PNG。模拟曝光帧的预览图不做 tone mapping,会直接把 linear RGB 截断到 [0, 1],再用 sRGB transfer 写入 8-bit PNG,所以高光截断区域会保持白色,欠曝预览也会明显偏暗。