Выберите яркость (экспозицию) из HDR-изображения

В настоящее время я застрял на видео projet из фотографий.

Проблема:

Извлекаю картинки из UE4, из-за ошибки не все огни учитываются при рендеринге скриншота.
Выходные изображения HDR. Я хочу получить лучшую яркость, потому что экспортированное изображение очень темное, как при первой экспозиции.

введите описание изображения здесь

Используя параметр «смещения экспозиции» в UE4, я могу получить действительно хорошую яркость моей сцены, но не могу применить этот параметр к рендерингу скриншота:
введите описание изображения здесь

Пытается :

Использование алгоритма Tonemapper (особенно cv::TonemapDragoЯ могу получить лучший результат изображения:
введите описание изображения здесь

В моем случае основная проблема алгоритма Tonemap заключается в том, что глобальная яркость изменяется в зависимости от яркости областей: во втором изображении окно добавляет много света, поэтому алгоритм понижает всю яркость, чтобы отрегулировать среднее значение.
В представленном видео изменение освещения очень жестокое.

Я пытался изменить яркость и насыщение без успеха.
Я изменил код TonemapDrago пытаясь использовать константы для некоторых меры алгоритма.

Вопрос:

Я хотел бы «выбрать время экспозиции» из изображения HDR. Tonemap основан на нескольких выдержках одного и того же изображения, что не интересно в моем случае.

Любая другая идея приветствуется.

РЕДАКТИРОВАТЬ:

CV :: Глубина коврика 5, тип CV_32FC3

cout << mat.step дай мне 19200

Вот 2 примера, которые я использую, чтобы попытаться решить мою проблему:

Первое изображение

Изображение со светлым окном

Изменить 2:

Невозможно открыть .HDR картинку с gimp, событие с плагином «Exploure blend».
Я могу получить достаточно хороший результат, используя Photoshop. Есть идеи об этом алгоритме? Любой из 6 алгоритмов Tonemap от OpenCV позволяет выбрать коррекцию экспозиции.
введите описание изображения здесь

РЕДАКТИРОВАТЬ 3:

Я следовал алгоритму объяснить в этом Tuto для 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 видел это тоже в комментарии)

8

Решение

Рассмотреть возможность использования Ретинекс. Он использует одно изображение для ввода и входит в GIMP, поэтому его легко поиграть, кроме того, вы можете получить его исходный код (или свернуть свой собственный, что в любом случае довольно просто). Поскольку у вас есть рендеры вместо фотографий — нет шума, и вы теоретически можете настроить цвета в соответствии с вашими потребностями.

Но, как уже сказал @ mark-ransom, у вас могут возникнуть проблемы с восстановлением информации из вашего отрендеренного вывода. Вы сказали, что у вас есть HDR изображения в качестве рендеринга, но я не уверен, что вы имеете в виду. Это одно изображение RGB? Какова глубина цвета каждого канала? Я попытался применить ретинекс к вашему образцу, но, очевидно, он не выглядит хорошо из-за сжатия и ограниченного диапазона, который был применен перед сохранением. Если ваш вывод имеет большой диапазон и не сжат — вы получите лучшие результаты.

РЕДАКТИРОВАТЬ: Я попробовал Retinex на вашем входе, и это оказалось не очень хорошо — яркие части изображения (лампы / окна) представляли уродливые темные ореолы вокруг них.

В этом случае простое отображение тонов&Гамма-коррекция выглядит намного лучше. Ваш код был почти в порядке, у вас была небольшая опечатка:
вместо cv::pow(exp, 1.0f / gamma, exp); ты должен был v::pow(mapped, 1.0f / gamma, exp);

Я возился с вашим кодом и заметил, что это отображение тонов ухудшает насыщенность цвета. Чтобы преодолеть это, я выполняю это только на V канале изображения HSV. Сравните результаты самостоятельно (слева — тональное отображение полного пространства, справа — только V):
введите описание изображения здесь
введите описание изображения здесь
Обратите внимание на цвет пола, небо в окне и желтоватый светлый цвет, который сохранился при таком подходе.

Вот полный код для полноты картины:

#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;
}
2

Другие решения

Какой вид освещения сцены вы сейчас используете? Похоже, вы используете точечные источники света, где бы лампочки были, но они не достаточно яркие. В вашей необработанной сцене сцена будет полной яркости. В вашей отрисованной сцене вы получите тьму.

Возможно, я бы порекомендовал хотя бы минимальный небесный свет, чтобы у вас всегда было немного света на вашей сцене (если только у вас нет областей фактической темноты)

0

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;
}

Этот алгоритм Tonemapper пытается симулировать смещение экспозиции в HDR
Если вы хотите использовать его в openCv 3.0, не забудьте открыть с -1 как последний аргумент imread cv::Mat img = cv::imread("mypicture.HDR", -1);

введите описание изображения здесь

0
По вопросам рекламы [email protected]