В настоящее время я застрял на видео 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 видел это тоже в комментарии)
Рассмотреть возможность использования Ретинекс. Он использует одно изображение для ввода и входит в 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;
}
Какой вид освещения сцены вы сейчас используете? Похоже, вы используете точечные источники света, где бы лампочки были, но они не достаточно яркие. В вашей необработанной сцене сцена будет полной яркости. В вашей отрисованной сцене вы получите тьму.
Возможно, я бы порекомендовал хотя бы минимальный небесный свет, чтобы у вас всегда было немного света на вашей сцене (если только у вас нет областей фактической темноты)
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);