[opencv] Égalisation d'histogramme (augmenter le contraste)

4_10_2_Histogram-2 : Égalisation de l'histogramme - Documentation officielle chinoise OpenCV

Apprenez le concept d'égalisation d'histogramme et utilisez-le pour améliorer le contraste des images.

résumer 

L'égalisation d'histogramme augmente le contraste d'une image.

Grâce à une fonction de transformation, les pixels d'entrée de la région lumineuse sont mappés sur les pixels de sortie de toute la région. C'est ce que fait l'égalisation d'histogramme. (faites en sorte que toutes les images aient les mêmes conditions d'éclairage)

  • L'égalisation d'histogramme fonctionne bien lorsque l'histogramme d'une image est limité à une zone spécifique.
  • Cela ne fonctionne pas bien lorsque l'histogramme couvre une grande surface (c'est-à-dire qu'il y a à la fois des pixels clairs et sombres) avec de grandes variations d'intensité.
  • Le contraste de fond s'améliore après l'égalisation de l'histogramme. Mais la plupart des informations sont perdues en raison de la luminosité élevée. En effet, son histogramme n'est pas limité à une zone précise comme nous l'avons vu dans le cas précédent .
  • Pour résoudre ce problème, l'égalisation adaptative de l'histogramme est utilisée . Dans ce cas, l'image est divisée en petits morceaux appelés "tiles" (dans OpenCV, tileSize est par défaut 8x8). Chacun de ces blocs est ensuite égalisé en histogramme comme d'habitude.
  • Dans les régions plus petites, l'histogramme sera limité à une région plus petite (sauf s'il y a du bruit). S'il y a du bruit, il sera amplifié. Pour éviter cela, une limite de contraste est appliquée .
  • Si un bac d'histogramme dépasse la limite de contraste spécifiée (40 par défaut dans OpenCV), ces pixels sont recadrés et répartis uniformément sur les autres bacs avant d'appliquer l'égalisation de l'histogramme. Après l'égalisation, pour supprimer les artefacts dans les limites des tuiles, appliquez une interpolation bilinéaire .  

teneur

résumer 

la théorie

Égalisation d'histogramme dans OpenCV

CLAHE (égalisation adaptative d'histogramme à contraste limité)


 

la théorie

Les valeurs de pixel d'une image sont limitées à une plage de valeurs spécifique. Par exemple, une image plus lumineuse limitera tous les pixels à des valeurs élevées.

Mais une bonne image aura des pixels de toutes les régions de l'image.

Vous devez donc étirer cet histogramme aux deux extrémités (comme le montre l'image ci-dessous, de wikipedia), ce que fait l'égalisation de l'histogramme (en termes simples). Cela augmente généralement le contraste de l'image.

Je vous suggère de lire la page Wikipedia sur l'égalisation d'histogramme pour plus de détails à ce sujet. Il explique si bien les exemples que vous pouvez presque tout comprendre après l'avoir lu. Au lieu de cela, nous verrons ici son implémentation Numpy. Après cela, nous verrons les fonctions OpenCV.

import numpy as np
import cv2 as cv
from matplotlib import pyplot as plt
img = cv.imread('wiki.jpg',0)
hist,bins = np.histogram(img.flatten(),256,[0,256])
cdf = hist.cumsum()
cdf_normalized = cdf * float(hist.max()) / cdf.max()
plt.plot(cdf_normalized, color = 'b')
plt.hist(img.flatten(),256,[0,256], color = 'r')
plt.xlim([0,256])
plt.legend(('cdf','histogram'), loc = 'upper left')
plt.show()

Vous pouvez voir que l'histogramme se trouve dans les zones les plus claires. Nous avons besoin du spectre complet. Pour cela, nous avons besoin d'une fonction de transformation qui mappe les pixels d'entrée de la région lumineuse aux pixels de sortie de toute la région. C'est ce que fait l'égalisation d'histogramme.

Maintenant, nous trouvons la plus petite valeur d'histogramme (à l'exclusion de 0) et appliquons l'équation d'égalisation d'histogramme donnée dans la page wiki. Mais j'ai utilisé ici, le tableau de concept de tableau masqué de Numpy. Pour les tableaux masqués, toutes les opérations sont effectuées sur des éléments non masqués. Vous pouvez en savoir plus sur les tableaux masqués dans la documentation Numpy.

cdf_m = np.ma.masked_equal(cdf,0)
cdf_m = (cdf_m - cdf_m.min())*255/(cdf_m.max()-cdf_m.min())
cdf = np.ma.filled(cdf_m,0).astype('uint8')

Nous avons maintenant une table de correspondance qui nous donne des informations sur la valeur de pixel de sortie pour chaque valeur de pixel d'entrée. Par conséquent, nous n'appliquons que la transformation.

img2 = cdf[img] 

Maintenant, nous calculons son histogramme et sa cdf comme avant (vous le faites) et le résultat ressemble à ceci :

Une autre caractéristique importante est que même si l'image est plus sombre (au lieu de celle que nous avons utilisée, une image plus claire), après égalisation, nous obtiendrons presque la même image. Par conséquent, ceci est utilisé comme "outil de référence" afin que toutes les images aient les mêmes conditions d'éclairage. Ceci est utile dans de nombreuses situations. Par exemple, dans la reconnaissance faciale, avant l'entraînement sur les données faciales, le processus d'égalisation de l'histogramme est effectué sur les images faciales pour qu'elles aient les mêmes conditions d'éclairage.

Égalisation d'histogramme dans OpenCV

OpenCV a une fonction cv.equalizeHist() pour ce faire. Son entrée est juste une image en niveaux de gris et la sortie est notre image égalisée d'histogramme. Vous trouverez ci-dessous un extrait de code simple montrant son utilisation avec la même image que nous utilisons :

img = cv.imread('wiki.jpg',0)
equ = cv.equalizeHist(img)
res = np.hstack((img,equ)) #stacking images side-by-side
cv.imwrite('res.png',res)

Vous pouvez donc maintenant prendre différentes images dans différentes conditions d'éclairage, les égaliser et vérifier le résultat.

  • L'égalisation d'histogramme fonctionne bien lorsque l'histogramme d'une image est limité à une zone spécifique.
  • Cela ne fonctionne pas bien lorsque l'histogramme couvre une grande surface (c'est-à-dire qu'il y a à la fois des pixels clairs et sombres) avec de grandes variations d'intensité.

CLAHE (égalisation adaptative d'histogramme à contraste limité)

La première égalisation d'histogramme que nous venons de voir tient compte du contraste global de l'image. Dans de nombreux cas, ce n'est pas une bonne idée. Par exemple, la figure ci-dessous montre l'image d'entrée et son résultat après égalisation globale de l'histogramme.

  • Le contraste de fond s'améliore après l'égalisation de l'histogramme. Mais comparez le visage de la statue dans les deux images . Nous y avons perdu la plupart des informations en raison de la luminosité élevée. En effet, son histogramme n'est pas limité à une zone spécifique comme nous l'avons vu dans les cas précédents (essayez de tracer l'histogramme de l'image d'entrée et vous obtiendrez plus d'intuition).
  • Pour résoudre ce problème, l'égalisation adaptative de l'histogramme est utilisée . Dans ce cas, l'image est divisée en petits morceaux appelés "tiles" (dans OpenCV, tileSize est par défaut 8x8). Chacun de ces blocs est ensuite égalisé en histogramme comme d'habitude.
  • Dans les régions plus petites, l'histogramme sera limité à une région plus petite (sauf s'il y a du bruit). S'il y a du bruit, il sera amplifié. Pour éviter cela, une limite de contraste est appliquée .
  • Si un bac d'histogramme dépasse la limite de contraste spécifiée (40 par défaut dans OpenCV), ces pixels sont recadrés et répartis uniformément sur les autres bacs avant d'appliquer l'égalisation de l'histogramme. Après l'égalisation, pour supprimer les artefacts dans les limites des tuiles, appliquez une interpolation bilinéaire .

L'extrait de code suivant montre comment appliquer CLAHE dans OpenCV :

import numpy as np
import cv2 as cv
img = cv.imread('tsukuba_l.png',0)
# create a CLAHE object (Arguments are optional).
clahe = cv.createCLAHE(clipLimit=2.0, tileGridSize=(8,8))
cl1 = clahe.apply(img)
cv.imwrite('clahe_2.jpg',cl1)

Consultez les résultats ci-dessous et comparez-les aux résultats ci-dessus, en particulier la zone de la statue :

Je suppose que tu aimes

Origine blog.csdn.net/dujuancao11/article/details/122438209
conseillé
Classement