Maison > développement back-end > Tutoriel Python > Égalisation de l'histogramme dans Python

Égalisation de l'histogramme dans Python

Jennifer Aniston
Libérer: 2025-02-26 11:19:13
original
623 Les gens l'ont consulté

Amélioration de l'image avec Python: un tutoriel d'égalisation de l'histogramme

jamais déçu par une image floue et de faible qualité? Imaginez améliorer cette image pour révéler des détails nets et une clarté améliorée. Ce tutoriel vous montre comment y parvenir en utilisant Python et la puissance de l'égalisation de l'histogramme.

L'égalisation de l'histogramme est une technique qui augmente considérablement le contraste d'image. C'est un processus fondamental utilisé dans presque tous les systèmes de caméras pour améliorer la qualité de l'image, et à la fin de ce tutoriel, vous comprendrez pourquoi.

Nous explorerons ce que sont les histogrammes et l'égalisation de l'histogramme, comment ils affectent les images, puis implémenter la technique dans Python. Commençons!

Comprendre les histogrammes d'image

Un histogramme représente visuellement la distribution des données numériques. L'axe X montre des plages de données (bacs) et l'axe y affiche la fréquence des valeurs dans chaque bac.

Dans le traitement d'image, chaque pixel a une couleur et une intensité. Les couleurs sont généralement représentées par des valeurs de canal rouge, vert et bleu (RVB), allant de 0 (pas de couleur) à 255 (couleur pleine). Un histogramme pour un canal de couleur montre la fréquence de chaque valeur d'intensité (0-255) pour ce canal. Les images en niveaux de gris ont un seul histogramme car les valeurs RVB sont identiques pour chaque pixel.

Les images avec des histogrammes concentrées dans une plage d'intensité étroite manquent souvent de clarté et de détails. Une image bien équilibrée présente une distribution plus large et plus uniforme des intensités.

Qu'est-ce que l'égalisation de l'histogramme?

L'égalisation de l'histogramme étire l'histogramme d'une image pour utiliser la plage d'intensité complète. Cela signifie étaler les valeurs d'intensité pour inclure à la fois les zones sombres et lumineuses, entraînant un contraste plus élevé et une visibilité des détails améliorée. Bien qu'il ne soit pas toujours idéal pour la photographie standard, il est inestimable dans les applications nécessitant des détails améliorés, tels que l'imagerie par satellite ou thermique.

Nous utiliserons une image de singe en niveaux de gris (avec un contraste réduit) comme exemple:

Histogram Equalization in Python

Accès aux intensités de pixels

Examinons comment accéder aux valeurs d'intensité des pixels à l'aide de python et opencv:

import cv2, random

img = cv2.imread('monkey.jpg')
img_shape = img.shape
height = img_shape[0]
width = img_shape[1]

for row in range(width):
    for column in range(height):
        if random.randint(0, width) == row and row:
            print(img[column][row])
Copier après la connexion
Copier après la connexion

Ce code lit l'image, détermine ses dimensions et imprime un échantillon de valeurs de pixels. OpenCV utilise l'ordre BGR (bleu, vert, rouge), donc [113 113 113] représente une intensité de 113 pour chaque canal.

L'égalisation de l'histogramme modifie ces intensités de pixels pour améliorer le contraste. Nous pouvons visualiser cela avec des histogrammes: un pour chaque canal de couleur (ou un seul histogramme pour les niveaux de gris). L'axe X montre des valeurs d'intensité et l'axe y montre leur fréquence.

En utilisant le code d'un article d'histogramme d'image séparé, l'histogramme de notre exemple d'image ressemble à ceci:

Histogram Equalization in Python

Cet histogramme montre la distribution sur les canaux BGR. Un exemple de sortie du code de valeur de pixels montre les valeurs d'intensité cohérentes sur les canaux:

import cv2, random

img = cv2.imread('monkey.jpg')
img_shape = img.shape
height = img_shape[0]
width = img_shape[1]

for row in range(width):
    for column in range(height):
        if random.randint(0, width) == row and row:
            print(img[column][row])
Copier après la connexion
Copier après la connexion

L'égalisation de l'histogramme vise à aplatir cet histogramme, distribuant des intensités plus uniformément dans la plage.

Analyser la fréquence d'intensité

Ce code Python calcule la fréquence des intensités de pixels:

<code>[113 113 113]
[110 110 110]
[106 106 106]
...</code>
Copier après la connexion

La sortie montre les valeurs d'intensité les plus fréquentes et leur nombre, mettant en évidence la concentration dans une plage limitée.

Implémentation de l'égalisation de l'histogramme dans Python

Nous utiliserons la fonction equalizeHist() d'OpenCV, mais cela ne fonctionne que sur les images en niveaux de gris. Par conséquent, nous allons nous convertir en espace colorimétrique YUV, égaliser le canal Y (luminance) et nous convertir en BGR:

import cv2

img = cv2.imread('monkey.jpg')
img_shape = img.shape
height = img_shape[0]
width = img_shape[1]

frequency = {}

for row in range(width):
    for column in range(height):
        intensity = img[column][row][0]
        count = frequency.get(intensity, 0)
        frequency[intensity] = count + 1

print("Unique Intensities", len(frequency))

most_frequent = dict(sorted(frequency.items(), key=lambda elem: elem[1], reverse=True))
intensity_values = most_frequent.keys()

i = 0
for intensity in intensity_values:
    i += 1
    if i <= 5:
        print(intensity, most_frequent[intensity])
Copier après la connexion

Exemple complet et résultats

Voici le code complet:

import cv2
import numpy

img = cv2.imread('monkey.jpg')
img_to_yuv = cv2.cvtColor(img, cv2.COLOR_BGR2YUV)
img_to_yuv[:, :, 0] = cv2.equalizeHist(img_to_yuv[:, :, 0])
hist_equalization_result = cv2.cvtColor(img_to_yuv, cv2.COLOR_YUV2BGR)
cv2.imwrite('result.jpg', hist_equalization_result)
Copier après la connexion

l'image résultante (result.jpg):

Histogram Equalization in Python

Une comparaison des images originales et améliorées:

Histogram Equalization in Python

L'image améliorée montre une clarté sensiblement améliorée. L'histogramme de l'image améliorée est plus plate, démontrant la distribution uniforme des intensités. L'analyse de fréquence d'intensité montrera également une distribution plus uniforme des valeurs.

Conclusion

Ce didacticiel a démontré comment améliorer le contraste d'image en utilisant l'égalisation de l'histogramme dans Python avec OpenCV. Les résultats mettent en évidence l'efficacité de cette technique dans l'amélioration de la qualité d'image et des détails sur la visibilité. L'histogramme plus plat résultant confirme la redistribution réussie des intensités de pixels.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal