2015-12-14 22 views
8

Obecnie utknąłem na projekcji wideo ze zdjęć.Wybierz jasność (ekspozycję) z obrazu HDR

Problem:

jestem wydobycia zdjęć z UE4, z powodu błędu, nie wszystkie światła są brane pod uwagę podczas renderowania ekranu. Wyjście to obrazy HDR. Chcę uzyskać lepszą jasność, ponieważ wyeksportowane zdjęcie jest bardzo ciemne, tak jak pierwsza ekspozycja.

enter image description here

Korzystanie z „Odchylenie ekspozycji” parametr w UE4 jestem w stanie rzeczywistym dobrej jasności mojej scenie, ale nie można zastosować ten parametr do renderowania Zrzut ekranu: enter image description here

Tries:

Stosując algorytm Tonemapper (speciafically cv::TonemapDrago) jestem w stanie uzyskać lepszy efekt obrazu: enter image description here

Głównym problemem, dla mojego przypadku, algorytmu Tonemap jest to, że globalna jasność zmienia się w zależności od jasności obszarów: na drugim obrazie okno dodaje dużo światła, więc algorytm obniża całą jasność, aby dostosować oznaczać. Na wyświetlanym wideo zmiana światła jest bardzo brutalna.

Próbowałem zmienić brightness i nasycenie bez powodzenia. Zmodyfikowałem kod TonemapDrago próbując użyć stałych dla jakiegoś steps algorytmu.

Pytanie:

chciałbym "wybrać czas naświetlania" z obrazu HDR. Tonemap opiera się na kilku czasach naświetlania tego samego obrazu, co nie jest interesujące w moim przypadku.

Każdy inny pomysł jest mile widziany.

EDIT:

głębokość CV :: Mat to 5, typ jest CV_32FC3

cout << mat.step mi dać 19200

Oto 2 próbki i używać, aby spróbować rozwiązać mój problem:

First Image

Image with light window

Edit 2:

nie można otworzyć obraz .hdr z gimp, zdarzenia z wtyczki "explosure blend". Jestem w stanie osiągnąć wystarczająco dobry wynik przy użyciu Photoshopa. Masz pomysł na algorytm? Każdy z 6 alg Tonemap przez OpenCV pozwala wybrać korektę ekspozycji. enter image description here

EDIT 3:

Mam następnie algorytm wyjaśnić w tym tuto dla OpenGL, który daje to C + kod do mnie:

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

Stosując tę ​​algo na moim. Obraz HDR uzyskałem bardzo jasny wynik nawet z korektą 1 i 1 dla gamma i ekspozycji: enter image description here

Czytanie kodu, coś jest nie tak, ponieważ 1 i 1 jako argument nie powinny modyfikować obrazu. Naprawiono to, odpowiedź została zaksięgowana. bardzo dziękuję @ user3896254 (Ge również to zauważył)

+0

Jaki format obrazu wyjściowego w? Jeśli nie ma wystarczającej głębi bitowej, odzyskanie utraconych danych może nie być możliwe. –

+0

@MarkRansom Format piksela .hdr otwarty z opencv to CV_32FC3 – Marcassin

+0

Jeśli prześlesz gdzieś przykład tego obrazu - łatwiej nam będzie Ci pomóc. Możesz zrzucić surowy bufor obrazu do pliku binarnego i powiedzieć rozdzielczość obrazu, aby inni mogli z niego korzystać. – alexisrozhkov

Odpowiedz

2

Rozważ użycie Retinex. Używa pojedynczego obrazu do wprowadzania i jest zawarty w GIMP, więc łatwo można go zabawić, poza tym możesz uzyskać jego kod źródłowy (lub przetasować własny, co i tak jest całkiem proste). Ponieważ renderujesz zamiast zdjęć - nie ma hałasu i teoretycznie jesteś w stanie dostosować kolory do swoich potrzeb.

Ale jak już powiedział @ mark-ransom, możesz mieć problemy z odzyskaniem informacji z renderowanych danych wyjściowych. powiedziałeś, że masz obrazy HDR jako render, ale nie jestem pewien co masz na myśli. Czy jest to pojedynczy obraz RGB? Jaka jest głębia kolorów każdego kanału? Próbowałem zastosować retinex do twojej próbki, ale oczywiście nie wygląda dobrze, ze względu na kompresję i ograniczony zakres, który został zastosowany przed zapisaniem. Jeśli twoje wyjście ma duży zasięg i nie jest skompresowane - uzyskasz lepsze wyniki.

EDYCJA: Próbowałem retinex na twoim wejściu i okazało się niezbyt dobre - jasne części obrazu (lampy/okna) wprowadziły wokół nich brzydkie, ciemne aureole.

W tym przypadku prosta korekcja gamma & wygląda dużo lepiej. Twój kod został prawie w porządku, po prostu miał małą literówkę: zamiast cv::pow(exp, 1.0f/gamma, exp); należy mieli v::pow(mapped, 1.0f/gamma, exp);

mam pomieszane dookoła z kodem, i zauważyłem, że ten tonemapping wydaje się pogorszyć nasycenia kolorów. Aby temu zaradzić, wykonuję go tylko na kanale V obrazu HSV. Porównaj wyniki samemu (po lewej stronie - pełna przestrzeń tonem, po prawej - tylko V): enter image description here enter image description here Uwaga kolor podłogi, niebo w oknie i żółtawy kolor światła, który został zachowany przy takim podejściu.

Oto pełny kod dla kompletności wywodu:

#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; 
} 
+0

Wooo ładny, tonemap na "wartość" od Obraz HSV daje lepsze wyniki. Dzięki za tę poprawkę! – Marcassin

0

Jakiego rodzaju oświetlenia scenicznego używasz? Wygląda na to, że używasz świateł punktowych, w których byłyby żarówki, ale one nie są wystarczająco jasne. W scenie, w której się nie poddałeś, scena będzie miała pełną jasność. W wyrenderowanej scenie dostaniesz ciemność.

bym może polecić przynajmniej minimalną niebo światło tak, że zawsze masz jakieś światło w całej sceny (chyba że masz obszary rzeczywistej ciemności)

+0

Problem z tym błędem polega na tym, że niektóre światła i światła punktowe nie są robione w renderowaniu 360 punktów widoku w UE Dodanie jaśniejszego nieba zwiększy światło z okna i tonemapper algo będzie jeszcze bardziej brutalny z ruchem kamery, a nawet z tym, wyodrębniony obraz będzie zbyt ciemny, aby można go było użyć "tak jak jest" – Marcassin

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

Algorytm ten jest Tonemapper próbuje symulować Odchylenie ekspozycji w HDR Jeśli chcesz użyć go w OpenCV 3.0 Nie zapomnij otworzy -1 jako ostatni argument imread cv::Mat img = cv::imread("mypicture.HDR", -1);

enter image description here