Attualmente sono bloccato su un video projet dalle immagini.Scegli la luminosità (esposizione) dall'immagine HDR
Problema:
sto estrarre immagini da UE4, a causa di un bug, non tutte le luci sono presi in considerazione durante il rendering della schermata. Le uscite sono immagini HDR. Voglio ottenere una luminosità migliore perché l'immagine esportata è molto scura, come la prima esposizione.
Con il parametro "Compensazione dell'esposizione" in UE4 io sono in grado di vero bene luminosità della mia scena, ma non può applicare questo parametro per il rendering screenshot:
Tentativi:
utilizzando l'algoritmo Tonemapper (speciafically cv::TonemapDrago
) io sono in grado di ottenere un risultato migliore immagine:
Il problema principale, nel mio caso, dell'algoritmo Tonemap è dovuto al fatto che la luminosità globale viene modificata in base alla luminosità delle aree: nella seconda immagine, la finestra aggiunge molta luce, quindi l'algoritmo riduce tutta la luminosità per regolare il significare. Nel video reso, il cambiamento di luce è molto brutale.
Ho provato a cambiare brightness e la saturazione senza successo. Ho modificato il codice dello TonemapDrago
cercando di utilizzare le costanti per alcuni steps dell'algoritmo.
Domanda:
vorrei "scegliere il tempo di esposizione" da un'immagine HDR. Tonemap si basa su diversi tempi di esposizione della stessa immagine, non interessanti nel mio caso.
Qualsiasi altra idea è benvenuta.
EDIT:
profondità CV :: Mat è 5, il tipo è CV_32FC3
cout << mat.step
mi danno 19200
Qui ci sono 2 campioni che uso per provare a risolvere il mio problema:
Edit 2:
Impossibile immagine .HDR aperto con gimp, evento con il plugin "explosure blend". Sono in grado di ottenere risultati abbastanza grandi con Photoshop. Qualche idea dell'algoritmo dietro a questo? Ognuna delle 6 alghe Tonemap di OpenCV consente di scegliere una correzione dell'esposizione.
EDIT 3:
ho seguito l'algoritmo spiegare in questo tuto per OpenGL, che sta dando questo codice C + a me:
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;
}
L'applicazione di questo algo sul mio. Immagine HDR Ho ottenuto risultati molto brillanti anche con una correzione di 1 e 1 per gamma ed esposizione:
Leggendo il codice, c'è qualcosa di sbagliato perché 1 e 1 come argomento non dovrebbero modificare l'immagine. Risolto il problema, la risposta è pubblicata. grazie mille a @ user3896254 (Ge l'ha visto anche nel commento)
Che formato è l'immagine di uscita in? Se non ha una profondità di bit sufficiente potresti non essere in grado di recuperare i dati persi. –
@MarkRansom Il formato del pixel dell'immagine .hdr aperto con opencv è CV_32FC3 – Marcassin
Se carichi un esempio di questa immagine da qualche parte, sarebbe più facile per noi aiutarti. È possibile scaricare il buffer di immagini raw in file binari e dire la risoluzione dell'immagine per consentire ad altri di utilizzarlo. – alexisrozhkov