【发布时间】:2016-03-20 14:29:57
【问题描述】:
我目前被困在图片视频项目上。
问题:
我正在从 UE4 中提取图片,由于一个错误,在屏幕截图的渲染过程中并未考虑所有灯光。 输出是 HDR 图像。我想得到更好的亮度,因为导出的图片很暗,就像第一次曝光一样。
使用 UE4 中的“曝光偏差”参数,我可以使我的场景具有良好的亮度,但不能将此参数应用于屏幕截图渲染:
尝试:
使用 Tonemapper 算法(特别是 cv::TonemapDrago)我可以获得更好的图像效果:
就我而言,色调映射算法的主要问题是因为全局亮度会根据区域的亮度而改变:在第二张图像中,窗口添加了大量光线,因此算法会降低所有亮度以调整意思是。 在渲染的视频中,光线变化非常残酷。
我尝试更改 brightness 和饱和度但没有成功。
我已经修改了TonemapDrago 的代码,试图对算法的一些steps 使用常量。
问题:
我想从 HDR 图像中“选择曝光时间”。 Tonemap 基于同一图像的多个曝光时间,在我的情况下并不有趣。
欢迎任何其他想法。
编辑:
CV::Mat 深度为 5,类型为 CV_32FC3
cout << mat.step给我19200
这是我用来解决问题的 2 个示例:
编辑 2:
无法使用 gimp 打开 .HDR 图片,使用“explosure blend”插件打开事件。 我能够使用 Photoshop 获得足够好的结果。知道背后的算法吗? OpenCV 的 6 个 Tonemap 算法中的任何一个都允许选择曝光校正。
编辑 3:
我已经按照tuto for openGL 中的算法解释,将这个 C+ 代码提供给我:
cv::Mat exposureTonemap (cv::Mat m, float gamma = 2.2, float exposure = 1)
{
// Exposure tone mapping
cv::Mat exp;
cv::exp( (-m) * exposure, exp );
cv::Mat mapped = cv::Vec3f(1.0) - exp;
// Gamma correction
cv::pow(exp, 1.0f / gamma, exp);
cv::imshow("exposure tonemap", exp );
cv::waitKey();
return exp;
}
在我的 .HDR 图片上应用这个算法,即使对伽马和曝光进行了 1 和 1 的校正,我也得到了非常明亮的结果:
阅读代码,有问题,因为 1 和 1 作为参数不应该修改图片。 解决了这个问题,答案已发布。非常感谢@user3896254(Ge 在评论中也看到了)
【问题讨论】:
-
输出图像是什么格式的?如果它没有足够的位深度,您可能无法恢复丢失的数据。
-
@MarkRansom opencv打开的.hdr图片像素格式为CV_32FC3
-
如果您在某处上传此图片的示例 - 我们会更容易为您提供帮助。您可以将原始图像缓冲区转储为二进制文件并说出图像分辨率以允许其他人使用它。
-
@user3896254 :完成,我添加了链接,我想比写下二进制文件更容易。我正在阅读并尝试您的答案
-
关于你添加的色调映射代码 - 你应该做 v::pow(mapped, 1.0f / gamma, exp);而不是 cv::pow(exp, 1.0f / gamma, exp);
标签: c++ opencv opencv3.0 unreal-engine4 hdr