[PYTHON] Normaliser la luminosité de l'image

Environnement d'exécution

Ubuntu 18.04 Python 3.6.9 OpenCV 3.3.0

Aperçu

Lors du traitement d'un grand nombre d'images, les photos claires et sombres sont mélangées, Cela affectera le résultat du traitement, je veux donc unifier la luminosité!

De cette pensée Puisque j'ai eu l'occasion de régler la luminosité de l'image lors du pré-traitement d'apprentissage, je vais résumer la méthode. Le but est de normaliser l'image couleur d'entrée à une luminosité uniforme. J'ai essayé trois types de méthodes.

** ① Aplatissement du graphite ② Aplatissement adaptatif de l'histogramme ③ Spécifiez l'écart moyen et standard de la valeur de luminosité **

Cliquez ici pour les photos de vérification. Taj Mahal avec une brume taj-mahal-1209004_1280.jpg L'histogramme de luminosité de cette image est réparti comme suit. On constate que les valeurs de pixels sont concentrées autour de 100 à 230. original.png

Bibliothèque à utiliser

import cv2
import numpy as np
from matplotlib import pyplot as plt

Prétraitement

Pour gérer la valeur de luminosité, commencez par acquérir une image en niveaux de gris. Si vous spécifiez un argument avec imread d'OpenCV, vous pouvez obtenir une image en échelle de gris en une seule prise, Cette fois, seule la luminosité de l'image couleur est modifiée, de sorte que les informations de couleur sont également acquises. Par conséquent, l'image est lue et convertie de RVB (BGR dans OpenCV) en HSV.

Image HSV ・ Teinte (teinte) ・ Saturation ・ Valeur (luminosité) Il est représenté par, et la valeur de la luminosité est utilisée.

Le code pour obtenir la valeur est le suivant.

img=cv2.imread(str(file)) #Chargement d'image
hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV) #Convertir en système de couleurs hsv
h,s,v = cv2.split(hsv) #Divisé en chaque composant

Parmi h, s, v, v est Value, qui est traitée comme une image en échelle de gris.

L'histogramme de l'image peut être facilement affiché avec la fonction matplotlib.

plt.hist(v.ravel(),256,[0,256]);plt.show()

Post-traitement

Si vous mentionnez d'abord le post-traitement, Comme le résultat variable qui stocke les résultats de ① à ③ est une image en échelle de gris qui représente la valeur de luminosité, Enfin, le traitement inverse du prétraitement est effectué pour revenir à l'image couleur.

hsv = cv2.merge((h,s,result))
rgb = cv2.cvtColor(hsv, cv2.COLOR_HSV2BGR)
cv2.imwrite("result.jpg ", rgb) #Lors de la sortie

** ① Aplatissement graphite **

La première méthode consiste à aplatir l'histogramme (répartition de la luminosité) de l'image. L'image d'aplatissement de l'histogramme est la suivante.

Histogrammeinebnung.png Le mot "aplatissement" donne l'impression que l'image est lisse, En fait, afin d'ajuster la valeur du pixel pour qu'elle apparaisse uniformément des pixels noirs purs aux pixels blancs purs, Le contraste est accentué et l'image devient claire.

Cette technique peut être confirmée par la fonction d'OpenCV. Le code est comme suit.

result = cv2.equalizeHist(v)

Cliquez ici pour l'image et l'histogramme résultants. result.jpg

equal.png

En regardant l'histogramme, les pixels autour de 250 sont discrets. Cela apparaît dans la partie de gradation de lumière en haut à droite de l'image de résultat et le saut de ton se produit en raison de l'effet d'accentuation du contraste. jagi.jpg Cela semble se produire parce que la distribution de l'histogramme de la valeur de luminosité de l'image d'origine n'est pas uniforme. La méthode suivante d'aplatissement de l'histogramme est l'aplatissement adaptatif de l'histogramme.

** ② Aplatissement adaptatif de l'histogramme **

La deuxième méthode consiste à aplatir l'histogramme dans (1) pour chaque petite zone. Voir Référence pour le mécanisme et les paramètres détaillés. Cela permet d'aplatir avec une précision plus élevée que (1), mais attention car si vous faites une erreur dans les paramètres, cela sera surestimé.

La mise en œuvre de l'aplatissement adaptatif d'histogramme est la suivante.

clahe = cv2.createCLAHE(clipLimit=2.0, tileGridSize=(3, 3))
result = clahe.apply(v)

clipLimit est un paramètre pour limiter le contraste. tileGridSize est la taille d'une petite zone, et cette fois, il est effectué dans une zone 3x3.

Voici les résultats. adaptive.jpg adaptive.png À partir de l'histogramme, on peut voir que les valeurs de pixel sont continuellement distribuées à partir de (1). Le saut de tonalité qui s'est produit dans (1) a été atténué, ce qui donne un histogramme bien équilibré.

** ③ Spécifiez l'écart moyen et standard de la luminosité **

Le troisième était basé sur le site here. Méthode d'acquisition de la valeur moyenne et de l'écart type de la luminosité d'une image et de les changer en valeurs arbitraires.

v = (v-np.mean(v)) / np.std(v) * s + m
result = np.array(v, dtype=np.uint8) #Renvoie dtype du tableau à unit8

--np.mean (v): luminosité moyenne --np.std (v): écart type de la luminosité

Tout d'abord, une image avec une luminosité moyenne de 0 et un écart type de 1 est générée en soustrayant la valeur moyenne de la luminosité de l'image d'origine et en divisant par l'écart type. L'écart type est défini en le multipliant par une valeur arbitraire s et la moyenne de luminosité est définie en ajoutant une valeur arbitraire m. Cette fois, s = 32 et m = 128 sont définis.

Cliquez ici pour les résultats. mean32.jpg mean32.png

À partir de l'histogramme, il peut être confirmé que les pixels sont agrégés autour de la luminosité moyenne de 128. Cette fois, lors du retour à une image couleur, elle sera convertie en un type entier, donc Si la luminosité est hors de la plage de 0 à 255 dans le résultat du calcul, le résultat sera incorrect et un ajustement est nécessaire.

en conclusion

Enfin, chaque résultat est affiché ensemble. Étant donné que les conditions après aplatissement de l'histogramme sont différentes, il ne s'agit pas d'une expérience de comparaison des performances, mais à titre de référence. À partir de la gauche Image originale-①Résultat-②Résultat-③Résultat marge1.jpg marge2.jpg Avec chaque méthode, les images prises dans divers environnements peuvent être ajustées à une certaine norme.

Cette fois, seule la luminosité a été normalisée, mais en normalisant également le contraste et la saturation, Vous pourrez créer une image plus uniforme.

Les références

・ Http://labs.eecs.tottori-u.ac.jp/sd/Member/oyamada/OpenCV/html/py_tutorials/py_imgproc/py_histograms/py_histogram_equalization/py_histogram_equalization.html ・ Https://cvtech.cc/std/

Recommended Posts

Normaliser la luminosité de l'image
Suppression du bruit de l'image
Reconnaissance d'image
Explorateur d'images