Si vous photographiez avec un smartphone ou un appareil photo numérique dans une pièce sombre avec un fort contraste comme le crépuscule, la vue nocturne, le contre-jour ou la lumière extérieure, la partie lumineuse peut être écrasée en blanc ou la partie sombre peut être écrasée en noir. Avez-vous déjà été déçu? C'est un phénomène qui se produit parce que la gradation dans les zones claires et sombres est insuffisante. Cette fois, je vais créer une image à plage dynamique élevée en synthétisant une image lumineuse et une image sombre d'une bonne manière.
Veuillez vous référer ici pour la construction de l'environnement à partir de maintenant. Construction de l'environnement d'OpenCV 3 et Python 3
Trois images JPEG prises avec deux expositions différentes. Afin de bien combiner, il est recommandé de fixer l'appareil photo, de rendre l'ouverture identique, de ne modifier que le temps d'exposition et de prendre des photos en continu.
Image traitée par OpenCV.
hdr.py
# -*- coding: utf-8 -*-
import cv2
import numpy as np
#Lire 3 fichiers image
img_fn = ["img1.jpg ", "img2.jpg ", "img3.jpg "]
img_list = [cv2.imread(fn) for fn in img_fn]
#Réglez le temps d'exposition pour 3 images
exposure_times = np.array([0.2, 0.05, 0.0125], dtype=np.float32)
#Synthèse HDR par méthode Debevec
merge_debvec = cv2.createMergeDebevec()
hdr_debvec = merge_debvec.process(img_list, times=exposure_times.copy())
tonemap1 = cv2.createTonemapDurand(gamma=2.2)
res_debvec = tonemap1.process(hdr_debvec.copy())
#Synthèse HDR par la méthode Robertson
merge_robertson = cv2.createMergeRobertson()
hdr_robertson = merge_robertson.process(img_list, times=exposure_times.copy())
tonemap2 = cv2.createTonemapDurand(gamma=2.2)
res_robertson = tonemap2.process(hdr_robertson.copy())
#Synthèse HDR par la méthode Mertens
merge_mertens = cv2.createMergeMertens()
res_mertens = merge_mertens.process(img_list)
#Convertir en données 8 bits
res_debvec_8bit = np.clip(res_debvec*255, 0, 255).astype('uint8')
res_robertson_8bit = np.clip(res_robertson*255, 0, 255).astype('uint8')
res_mertens_8bit = np.clip(res_mertens*255, 0, 255).astype('uint8')
#Enregistrer l'image dans un fichier
cv2.imwrite("ldr_debvec.jpg ", res_debvec_8bit)
cv2.imwrite("ldr_robertson.jpg ", res_robertson_8bit)
cv2.imwrite("fusion_mertens.jpg ", res_mertens_8bit)
Si le nombre de photos est de 3 et que l'exposition est de -2, 0, +2, ce sera comme suit.
img_fn = ["img1.jpg ", "img2.jpg ", "img3.jpg "]
exposure_times = np.array([0.2, 0.05, 0.0125], dtype=np.float32)
Si vous avez 5 photos et que l'exposition est de -2, -1, 0, +1, +2, changez cette partie comme suit.
img_fn = ["img1.jpg ", "img2.jpg ", "img3.jpg ", "img4.jpg ", "img5.jpg "]
exposure_times = np.array([0.2, 0.1, 0.05, 0.025, 0.0125], dtype=np.float32)
Cette fois, nous avons pu synthétiser une image puissante en utilisant la méthode Martens sans aucun réglage de paramètre. J'ai essayé diverses choses avec d'autres exemples d'images [1], mais parmi les trois, la méthode Martens était la plus belle. .. En tant que fonctions liées au HDR, OpenCV fournit également des fonctions de réglage de la tonalité (Drago, Durand, Reinhard, Mantiuk) et des fonctions d'étalonnage (Debevec, Robertson). J'ai trouvé qu'OpenCV peut être utilisé pour une composition automatique et assez bonne, je voudrais donc l'utiliser dans certains cas.