2015-12-23 2 views
1

J'essaie d'obtenir des fonctions liées à HDR fonctionnant avec OpenCV-Python: spécifiquement j'essaie de reproduire le OpenCV C++ HDR tutorial. Malheureusement, l'image/tableau hdr qui en résulte est complètement blanc (toutes les valeurs sont Inf). Voici un MCVE. 1.jpg, 2.jpg, 3.jpg sont toutes des images JPG 870 × 580 RVB (affichage interne RGB KODAK sRGB) avec des temps d'exposition de 1/3200, 1/800 et 1/200 respectivement. J'ai testé cela avec 2 autres jeux d'images JPG, dont l'un est disponible sur Wikimedia.OpenCV-Python createMergeDebevec retourne un tableau d'Inf

>>> import cv2 
>>> import numpy as np 
>>> 
>>> img = cv2.imread("1.jpg") 
>>> img2 = cv2.imread("2.jpg") 
>>> img3 = cv2.imread("3.jpg") 
>>> 
>>> images = np.array([img, img2, img3]) 
>>> times = np.array([1.0/3200,1.0/800,1.0/200]) 
>>> 
>>> merger = cv2.createMergeDebevec() 
>>> hdr = merger.process(images, times) 
>>> hdr 
array([[[ inf, inf, inf], 
     [ inf, inf, inf], 
     [ inf, inf, inf], 
     ..., 
     [ inf, inf, inf], 
     [ inf, inf, inf], 
     [ inf, inf, inf]], 

     [[ inf, inf, inf], 
     [ inf, inf, inf], 
     [ inf, inf, inf], 
     ..., 
     [ inf, inf, inf], 
     [ inf, inf, inf], 
     [ inf, inf, inf]], 

     [[ inf, inf, inf], 
     [ inf, inf, inf], 
     [ inf, inf, inf], 
     ..., 
     [ inf, inf, inf], 
     [ inf, inf, inf], 
     [ inf, inf, inf]], 

     ..., 
     [[ inf, inf, inf], 
     [ inf, inf, inf], 
     [ inf, inf, inf], 
     ..., 
     [ inf, inf, inf], 
     [ inf, inf, inf], 
     [ inf, inf, inf]], 

     [[ inf, inf, inf], 
     [ inf, inf, inf], 
     [ inf, inf, inf], 
     ..., 
     [ inf, inf, inf], 
     [ inf, inf, inf], 
     [ inf, inf, inf]], 

     [[ inf, inf, inf], 
     [ inf, inf, inf], 
     [ inf, inf, inf], 
     ..., 
     [ inf, inf, inf], 
     [ inf, inf, inf], 
     [ inf, inf, inf]]], dtype=float32) 

Une chose intéressante à noter est que le tableau "fois" est modifié après l'appel merger.process

>>> times 
array([-8.07090609, -6.68461173, -5.29831737]) 

J'utilise la version OpenCV:

>>> cv2.__version__ 
'3.0.0' 

La fusion. appel de processus a une signature comme suit:

>>> import inspect 
>>> inspect.getdoc(merger.process) 
'process(src, times, response[, dst]) -> dst or process(src, times[, dst]) -> dst' 
+0

-vous l'esprit de partager votre 1,2 et 3.jpg? Ceci est à des fins de reproduction d'erreur. Ou vous avez essayé ceci avec d'autres JPG mais produisant le même résultat? En outre, je ne peux pas sembler trouver cv2 version 3 avec mon PyCharm – Ian

+0

Ouais je l'ai essayé avec deux séries d'images différentes.Si je pouvais le faire fonctionner avec n'importe quel ensemble d'images, je serais satisfait. – kshikama

Répondre

0

I réussi à le faire fonctionner avec l'aide de la réponse de Velimir. Mon problème était que je devais construire le tableau d'images dans l'ordre décroissant des véhicules électriques. Tandis que la réponse de Velimir fait ce dont j'ai besoin, je fais une réponse séparée parce que je veux souligner que le tableau times représente les temps d'exposition au lieu des VE. J'ai également ajouté la méthode de tonimapping qui devrait être appliquée après la construction de la carte de radiance.

import cv2 
import numpy as np 

img = cv2.imread("bright.jpg") # Exposure time 1/8 
img2 = cv2.imread("normal.jpg") # Exposure time 1/13 
img3 = cv2.imread("dark.jpg") # Exposure time 1/15 

images = [img, img2, img3] 
times = np.array([1/8.,1/13.,1/15.]) 
merger = cv2.createMergeDebevec() 
hdr = merger.process(images, times) 
tonemap = cv2.createTonemapDurand(2.2) 
tonemapped_image = tonemap.process(hdr) 
cv2.imwrite('tonemapped_image.jpg', tonemapped_image * 255) 

Les exemples d'images sont de http://ttic.uchicago.edu/~cotter/projects/hdr_tools/

Image claire

Bright Image

image normale

Normal Image

Image sombre Dark Image

tonemapped image résultante Combined Image

1

Vous ne savez pas comment l'algorithme Debevec fonctionne, mais j'ai réussi à obtenir un exemple de travail que vous avez demandé. Notez l'ordre décroissant des images (et leurs EVs correspondants) et le multiplicateur sur la ligne 5. Jouez avec le multiplicateur, et vous pouvez obtenir des résultats légèrement différents. Pas sûr de ce qui se passe, mais ça semble fonctionner. Ici, vous allez:

EV + 4.09.JPGenter image description hereEV + 1.18.JPGenter image description hereEV-1.82.JPGenter image description here

import cv2 
import numpy as np 
images = [cv2.imread(x) for x in 'EV+4.09.JPG', 'EV+1.18.JPG', 'EV-1.82.JPG'] 
times = np.array([4.09, 1.18, -1.82]) 
times *= 1000. 
merger = cv2.createMergeDebevec() 
hdr = merger.process(images, times) 
print hdr 
cv2.imwrite('out.jpg', hdr) 

out.jpgenter image description here