Créer une image à plage dynamique élevée (HDR) avec OpenCV et Python (Mertens, Robertson, Debevec)

introduction

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.

environnement

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

Image avant traitement

サムネイル.png

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.

Après le traitement HDR

Image traitée par OpenCV.

programme

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)

en conclusion

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.

Recommended Posts

Créer une image à plage dynamique élevée (HDR) avec OpenCV et Python (Mertens, Robertson, Debevec)
Créez une illusion rayée avec correction gamma pour Python3 et openCV3
Créez une image factice avec Python + PIL.
Remarques sur le traitement d'images HDR et RAW avec Python
Créez diverses vidéos Photoshop avec Python + OpenCV ② Créez une image fixe Photoshop
Édition d'image avec python OpenCV
Créer un répertoire avec python
Créez une caméra de surveillance WEB avec Raspberry Pi et OpenCV
Créons un diagramme PRML avec Python, Numpy et matplotlib.
Créez un outil d'analyse vidéo simple avec python wxpython + openCV
Briller la vie avec Python et OpenCV
Interpolation automatique des images avec OpenCV et Python (méthode de marche rapide, Navier-Stokes)
[Python] Utilisation d'OpenCV avec Python (filtrage d'image)
Réseau neuronal avec OpenCV 3 et Python 3
[Python] Utilisation d'OpenCV avec Python (transformation d'image)
Comment créer une caméra de surveillance (caméra de sécurité) avec Opencv et Python
Créez un simple OMR (lecteur de feuille de marque) avec Python et OpenCV
Créez un lot planifié simple à l'aide de l'image Python de Docker et de parse-crontab
Dessinez une illusion d'aquarelle avec détection des contours en Python3 et openCV3
Trouver la similitude d'image avec Python + OpenCV
Créez votre propre caméra virtuelle avec Python + OpenCV et appliquez des effets originaux
[Python] Créez un linebot pour écrire le nom et l'âge sur l'image
Créez un environnement Python 3 avec pyenv sur Mac et affichez des graphiques Network X
Créez un arbre de décision à partir de 0 avec Python et comprenez-le (5. Entropie des informations)
Créer un décorateur de fonction Python avec Class
[Python] Créez un environnement virtuel avec Anaconda
Créons un groupe gratuit avec Python
Capturer des images avec Pupil, python et OpenCV
Un mémo contenant Python2.7 et Python3 dans CentOS
Traitement d'image avec Python et OpenCV [Tone Curve]
Créer et décrypter du code César avec python
Acquisition d'images depuis une caméra avec Python + OpenCV
Créez diverses vidéos Photoshop avec Python + OpenCV ③ Créez diverses vidéos Photoshop
Créer un compteur de fréquence de mots avec Python 3.4
Traitement d'image léger avec Python x OpenCV
Créer en Python sans fichier image factice dans Django et tester le téléchargement de l'image
Créons un système de réception simple avec le framework sans serveur Python Chalice et Twilio
[Python] Comment créer un environnement de serveur Web local avec SimpleHTTPServer et CGIHTTPServer
Hello World et détection de visage avec OpenCV 4.3 + Python
Créer un cadre avec un arrière-plan transparent avec tkinter [Python]
Construire un environnement python avec virtualenv et direnv
J'ai essayé de "différencier" l'image avec Python + OpenCV
Créer un papier peint à pois avec la bibliothèque d'images Python
Créer un LINE BOT avec Minette pour Python
[Diverses analyses d'images avec plotly] Visualisation dynamique avec plotly [python, image]
Comment recadrer une image avec Python + OpenCV
Créer un environnement virtuel avec conda avec Python
Créer une page qui se charge indéfiniment avec python
[Note] Créez une classe de fuseau horaire sur une ligne avec python
Vous pouvez facilement créer une interface graphique même avec Python
Créer un environnement de construction python3 avec Sublime Text3
Créer une carte Web en utilisant Python et GDAL
Créer une barre de couleurs avec Python + Qt (PySide)
J'ai essayé de "binariser" l'image avec Python + OpenCV
Créer une image avec des caractères avec python (japonais)
Étapes pour créer un bot Twitter avec Python
Lancer un serveur Web avec Python et Flask
Créer un arbre de décision à partir de 0 avec Python (1. Présentation)