当前位置: 首页 > 知识库问答 >
问题:

从HDR图像中选择光度(曝光)

洪鸿
2023-03-14

我目前正忙于一个来自图片的视频项目。

问题:

我正在从UE4中提取图片,由于一个错误,在屏幕截图的渲染过程中并没有考虑所有的灯光。输出是HDR图像。我想获得更好的亮度,因为导出的图片非常暗,就像第一次曝光一样。

尝试:

在我的例子中,Tonemap算法的主要问题是,全局亮度根据区域的亮度而变化:在第二幅图像中,窗口添加了大量的灯光,因此该算法降低了所有亮度以调整平均值。在渲染的视频中,光线变化非常残酷。

我试图改变亮度和饱和度,但没有成功。我修改了TonemapDrago的代码,试图在算法的某些步骤中使用常量

问题:

我想从HDR图像中“选择曝光时间”。Tonemap基于同一图像的多个曝光时间,在我的情况下并不有趣。

欢迎任何其他想法。

编辑:

CV::Mat深度为5,类型为CV\U 32FC3

<代码>cout

以下是我用来解决问题的两个示例:

第一张图片

带有灯光窗口的图像

编辑2:

编辑3:

我遵循了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;
}

阅读代码时,出现了一些错误,因为1和1作为参数不应该修改图片。修正了这一点,答案已发布。非常感谢@user3896254(Ge在评论中也看到了这一点)

共有3个答案

羊舌成周
2023-03-14
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::Scalar(1.0f, 1.0f, 1.0f) - exp;

  // Gamma correction 
  cv::pow(mapped, 1.0f / gamma, mapped);

  /*
  cv::imshow("exposure tonemap", mapped );
  cv::waitKey();
  */

  return mapped;
}

该算法是一个色调映射器,试图模拟HDR中的曝光偏差,如果您想在openCv 3.0中使用它,请不要忘记打开imread的最后一个参数-1(“mypicture.HDR”,-1)

慎弘化
2023-03-14

你目前使用的是哪种场景照明?看起来你在灯泡所在的地方使用了点灯,但是它们不够亮。在你未渲染的场景中,场景将是全亮度的。在你渲染的场景中,你会得到黑暗。

我可能会建议至少使用最小的天光,这样你的场景中总是有一些光线(除非你有实际的黑暗区域)

鲜于光赫
2023-03-14

考虑使用Retinex。它使用单个图像进行输入,并包含在GIMP中,因此很容易玩弄,此外您可以获取它的源代码(或滚动您自己的,无论如何都很简单)。由于您有渲染而不是照片——没有噪音,理论上您可以根据需要调整颜色。

但正如@markransom所说,从渲染输出中恢复信息可能会有困难。你说你有HDR图像作为渲染输出,但我不知道你的意思是什么。它是单个RGB图像吗?每个通道的颜色深度是多少?我已经尝试将retinex应用于您的示例,但显然它看起来不太好,因为在保存之前应用了压缩和有限的范围。如果您的输出具有高范围且未被压缩,则会得到更好的结果。

编辑:我在你的输入上尝试了retinex,结果不是很好——图像的明亮部分(灯/窗户)在它们周围引入了丑陋的黑暗光环。

在本例中,简单色调映射

为了完整起见,以下是完整代码:

#include <opencv2/opencv.hpp>

using namespace cv;

Mat1f exposureTonemap (Mat1f m, float gamma = 2.2, float exposure = 1) {
  // Exposure tone mapping
  Mat1f exp;
  cv::exp( (-m) * exposure, exp );
  Mat1f mapped = 1.0f - exp;

  // Gamma correction
  cv::pow(mapped, 1.0f / gamma, mapped);

  return mapped;
}

Mat3f hsvExposureTonemap(Mat &a) {
  Mat3f hsvComb;
  cvtColor(a, hsvComb, COLOR_RGB2HSV);

  Mat1f hsv[3];
  split(hsvComb, hsv);

  hsv[2] = exposureTonemap(hsv[2], 2.2, 10);

  merge(hsv, 3, hsvComb);

  Mat rgb;
  cvtColor(hsvComb, rgb, COLOR_HSV2RGB);

  return rgb;
}

int main() {
  Mat a = imread("first.HDR", -1);
  Mat b = imread("withwindow.HDR", -1);

  imshow("a", hsvExposureTonemap(a));
  imshow("b", hsvExposureTonemap(b));
  waitKey();

  return 0;
}
 类似资料:
  • 我正在做一个使用HDR传感器的项目。 我们每幅图像读取4幅“图像”- 为了获得具有最高可能动态范围的输出图像,“混合”这4幅图像的最佳方式是什么? 有没有人可以举一个没有OpenCV这样的外部库的好例子? 这应该在C应用程序中实时工作。 谢谢

  • 注意:在 Photoshop CS6 中,3D 功能是 Photoshop Extended 的一部分。Photoshop Extended 中的所有功能是 Photoshop CC 的一部分。Photoshop CC 不提供单独的 Extended 版本。 曝光度和 HDR 色调调整主要针对 32 位的 HDR 图像,但是您也可以将其应用于 16 位和 8 位图像以创建类似 HDR 的效果。 调

  • 我试图显示一个对话框,在那里按下图像按钮,然后从图库中选择图片或从相机中拍摄一些图片。我已经在努力选择一个图像并将其插入到正确的图像视图中。 现在,单击ImageButton(android:id=“@ id/imageSelect”)将显示对话框,然后选择从图库中选择,但它将图像插入(android:id=“@ id/imageSelect1),应该插入到(android:id=”@ id/im

  • 我必须做一个按钮,将提供从画廊或从相机选择图像。 结果是有效的。如果我从图库中选择,图像查看器将查看它,如果我选择从相机拍照,它也有效。问题是,在我的show FileChooser()方法中,我所有的意图都在同时运行,所以当我从图库中选择时,相机仍然运行。我选择相机,图库也在打开。我认为我应该在切换案例模式下实现我的代码,但我不明白如何做到这一点。请帮助解决我的初学者问题。

  • 我正在尝试从图库中浏览一个图像。但我得到以下运行时异常 代码是

  • 问题内容: 我需要在手机中打开我的画廊,然后选择一张在活动中在imageview中打开的图片..没什么困难..但是我在模拟器(genymotion)中有完美的代码和thise代码可以运行..但是在小米Mi4上却没有。 打开画廊选择项目,什么也没有。 我没有更多的电话了:( 我尝试下载一些与此主题相关的示例,并且每个示例都是相同的。 您是否有一些从图库中选择图像并在imageview中显示的项目?如