Heim >Backend-Entwicklung >Python-Tutorial >Histogrammausgleich in Python
Bildverstärkung mit Python: Ein Histogrammausgleich Tutorial
wurde jemals enttäuscht von einem verschwommenen Bild von geringer Qualität? Stellen Sie sich vor, Sie verbessern dieses Bild, um knackige Details und verbesserte Klarheit zu enthüllen. Dieses Tutorial zeigt Ihnen, wie Sie dies mit Python und der Leistung der Histogrammausgleich erreichen können.
Die Ausgleich vonHistogramm ist eine Technik, die den Bildkontrast erheblich stärkt. Es ist ein grundlegender Prozess, der in fast allen Kamerasystemen zur Verbesserung der Bildqualität verwendet wird. Am Ende dieses Tutorials werden Sie verstehen, warum.
Wir werden untersuchen, was Histogramme und Histogrammausgleiche sind, wie sie Bilder beeinflussen, und dann die Technik in Python implementieren. Beginnen wir!
Bildhistogramme verstehen
Ein Histogramm repräsentiert visuell die Verteilung numerischer Daten. Die x-Achse zeigt Datenbereiche (Behälter) an, und die y-Achse zeigt die Häufigkeit von Werten in jedem Behälter an.
In der Bildverarbeitung hat jedes Pixel eine Farbe und Intensität. Die Farben werden typischerweise durch rot, grün und blau (RGB) -Kanalwerte dargestellt, von 0 (keine Farbe) bis 255 (volle Farbe). Ein Histogramm für einen Farbkanal zeigt die Frequenz jedes Intensitätswerts (0-255) für diesen Kanal. Graustufenbilder haben ein einzelnes Histogramm, da die RGB -Werte für jedes Pixel identisch sind.
Bilder mit Histogrammen, die in einem engen Intensitätsbereich konzentriert sind, fehlen häufig Klarheit und Details. Ein ausgewogenes Bild weist eine breitere, gleichmäßigere Verteilung der Intensitäten auf.
Was ist Histogrammausgleich?
Histogramm Equalization erstreckt sich über das Histogramm eines Bildes, um den vollen Intensitätsbereich zu verwenden. Dies bedeutet, dass die Intensitätswerte sowohl dunkle als auch helle Bereiche ausbreiten, was zu einem höheren Kontrast und einer verbesserten Sichtbarkeit von Details führt. Obwohl es nicht immer ideal für die Standardfotografie ist, ist es für Anwendungen, die erweiterte Details erfordern, von unschätzbarem Wert, z. B. Satelliten oder thermische Bildgebung.
Wir werden ein Graustufen -Affenbild (mit reduziertem Kontrast) als Beispiel verwenden:
Lassen Sie uns untersuchen, wie Sie mit Python und OpenCV auf Pixelintensitätswerte zugreifen:
<code class="language-python">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])</code>Dieser Code liest das Bild, bestimmt seine Abmessungen und druckt ein Beispiel von Pixelwerten. OpenCV verwendet BGR -Bestellung (blau, grün, rot), daher ist
eine Intensität von 113 für jeden Kanal. [113 113 113]
Verwenden von Code aus einem separaten Bildhistogrammartikel, das Histogramm für unser Beispielbild sieht folgendermaßen aus:
Dieses Histogramm zeigt die Verteilung über die BGR -Kanäle. Eine Stichprobenausgabe aus dem Pixelwertcode zeigt die konsistenten Intensitätswerte über Kanäle hinweg:
<code class="language-python">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])</code>
Histogramm Equalization zielt darauf ab, dieses Histogramm zu verflachten und Intensitäten gleichmäßiger über den Bereich zu verteilt.
Analyse der Intensitätsfrequenz
Dieser Python -Code berechnet die Häufigkeit der Pixelintensitäten:
<code>[113 113 113] [110 110 110] [106 106 106] ...</code>
Der Ausgang zeigt die häufigsten Intensitätswerte und ihre Zählungen und zeigt die Konzentration in einem begrenzten Bereich hervor.
Implementierung der Histogrammausgleich in Python
Wir werden OpenCVs equalizeHist()
-Funktion verwenden, aber sie funktioniert nur auf Graustufenbildern. Daher werden wir in den YUV -Farbton konvertieren, den Y -Kanal (Luminanz) ausgleichen und in BGR zurückkehren:
<code class="language-python">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])</code>
Vollständiges Beispiel und Ergebnisse
Hier ist der vollständige Code:
<code class="language-python">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)</code>
Das resultierende Bild (result.jpg
):
Ein Vergleich von originalen und erweiterten Bildern:
Das erweiterte Bild zeigt eine deutlich verbesserte Klarheit. Das Histogramm des erweiterten Bildes ist flacher und zeigt die gleichmäßige Verteilung der Intensitäten. Die Intensitätsfrequenzanalyse zeigt auch eine gleichmäßigere Verteilung der Werte.
Schlussfolgerung
Dieses Tutorial zeigte, wie der Bildkontrast unter Verwendung der Histogrammausgleich in Python mit OpenCV verbessert wird. Die Ergebnisse unterstreichen die Effektivität dieser Technik bei der Verbesserung der Bildqualität und zur Detailssicht. Das resultierende flachere Histogramm bestätigt die erfolgreiche Umverteilung der Pixelintensitäten.
Das obige ist der detaillierte Inhalt vonHistogrammausgleich in Python. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!