OpenCV Bildhistogramm
In der Bildverarbeitung ist das Histogramm ein sehr wichtiges Werkzeug, das uns helfen kann, die Pixelverteilung eines Bildes zu verstehen.
Durch die Analyse des Bildhistogramms können wir Operationen wie Bildverbesserung, Kontrastanpassung und Bildsegmentierung durchführen.
Was ist ein Bildhistogramm?
Ein Bildhistogramm ist eine grafische Darstellung der Pixelintensitätsverteilung eines Bildes. Bei Graustufenbildern zeigt das Histogramm die Häufigkeit jedes Grauwerts (0 bis 255), der im Bild vorkommt. Bei Farbbildern können wir das Histogramm für jeden Kanal (z. B. R, G, B) separat berechnen.
Das Histogramm kann uns helfen, Informationen wie die Helligkeit und den Kontrast eines Bildes zu verstehen. Wenn sich das Histogramm beispielsweise im Bereich niedriger Graustufen konzentriert, ist das Bild dunkel; wenn das Histogramm gleichmäßig verteilt ist, hat das Bild einen guten Kontrast.
Histogramm:Stellt die Verteilung der Pixelintensitäten in einem Bild dar. Die horizontale Achse repräsentiert die Pixelintensitätswerte und die vertikale Achse die Anzahl der Pixel mit diesem Intensitätswert.
Graustufenhistogramm:Ein Histogramm für Graustufenbilder, das die Anzahl der Pixel auf jeder Graustufe darstellt.
Farbhistogramm:Ein Histogramm für Farbbilder, das die Pixelintensitätsverteilung jedes Farbkanals (z. B. BGR) separat darstellt.
OpenCV bietet eine umfangreiche Sammlung von Funktionen zur Berechnung und Bearbeitung von Histogrammen:
| Merkmal | Funktion | Beschreibung |
|---|---|---|
| Histogramm berechnen | cv2.calcHist() | Das Histogramm eines Bildes berechnen. |
| Histogramm-Equalisierung | cv2.equalizeHist() | Bildkontrast verbessern. |
| Histogrammvergleich | cv2.compareHist() | Die Ähnlichkeit zweier Histogramme vergleichen. |
| Histogramm zeichnen | matplotlib.pyplot.plot() | Verwenden Sie Matplotlib, um Histogramme zu zeichnen. |
Funktionen zur Histogrammberechnung in OpenCV
In OpenCV können wircv2.calcHist()die Funktion zur Berechnung des Histogramms eines Bildes verwenden.
cv2.calcHist()Funktionssyntax
cv2.calcHist(images, channels, mask, histSize, ranges[, hist[, accumulate]])
Parameterbeschreibung
- images: Die Liste der Eingabebilder, normalerweise eine Liste mit Einkanal- oder Mehrkanalbildern. Zum Beispiel
[img]。 - channels: Der Kanalindex, für den das Histogramm berechnet werden soll. Für Graustufenbilder verwenden Sie
[0]; für Farbbilder können Sie[0]、[1]、[2]zur Berechnung der Histogramme der blauen, grünen bzw. roten Kanäle verwenden. - mask: Maskenbild. Wenn eine Maske angegeben ist, werden nur Pixel innerhalb des Maskenbereichs berechnet. Wenn keine Maske benötigt wird, können Sie übergeben
None。 - histSize: Die Anzahl der Bins im Histogramm. Für Graustufenbilder wird sie normalerweise auf
[256], was angibt, dass die Graustufen in 256 Bins unterteilt werden. - ranges: Der Bereich der Pixelwerte. Für Graustufenbilder wird er üblicherweise eingestellt auf
[0, 256], was angibt, dass der Bereich der Pixelwerte 0 bis 255 beträgt. - hist: Das Ausgabe-Histogramm-Array.
- accumulate: Ob das Histogramm akkumuliert werden soll. Wenn eingestellt auf
True, wird das Histogramm nicht gelöscht, sondern bei jedem Aufruf akkumuliert.
Angenommen, wir haben ein Graustufenbildimg, können wir den folgenden Code verwenden, um sein Histogramm zu berechnen:
Beispiel
import numpy as np
import matplotlib.pyplot as plt
# Bild einlesen
img = cv2.imread('image.jpg', cv2.IMREAD_GRAYSCALE)
# Histogramm berechnen
hist = cv2.calcHist([img], [0], None, [256], [0, 256])
# Histogramm zeichnen
plt.plot(hist)
plt.title('Graustufen-Histogramm')
plt.xlabel('Pixelwert')
plt.ylabel('Häufigkeit')
plt.show()
Histogramm-Equalisierung
Histogramm-Equalisierung ist eine Methode zur Verbesserung des Bildkontrasts durch Neuverteilung der Pixelintensitätswerte, um das Histogramm gleichmäßiger zu machen.
Syntax:
equalized_image = cv2.equalizeHist(image)
Beispiel
equalized_image = cv2.equalizeHist(image)
# Ergebnis anzeigen
cv2.imshow("Equalisiertes Bild", equalized_image)
cv2.waitKey(0)
cv2.destroyAllWindows()
Farbhistogramm
Farbhistogramm berechnen
Für Farbbilder kann das Histogramm jedes Farbkanals separat berechnet werden.
Beispiel
image = cv2.imread("path/to/image")
# Histogramm jedes BGR-Kanals berechnen
colors = ('b', 'g', 'r')
for i, color in enumerate(colors):
hist = cv2.calcHist([image], [i], None, [256], [0, 256])
plt.plot(hist, color=color)
# Histogramm zeichnen
plt.title("Farbhistogramm")
plt.xlabel("Pixelintensität")
plt.ylabel("Pixelanzahl")
plt.show()
Farbhistogramm-Equalisierung
Für Farbbilder kann die Histogramm-Equalisierung auf jeden Kanal separat angewendet werden.
Beispiel
b, g, r = cv2.split(image)
# Histogramm-Equalisierung für jeden Kanal durchführen
b_eq = cv2.equalizeHist(b)
g_eq = cv2.equalizeHist(g)
r_eq = cv2.equalizeHist(r)
# Kanäle zusammenführen
equalized_image = cv2.merge([b_eq, g_eq, r_eq])
# Ergebnis anzeigen
cv2.imshow("Equalisiertes Farbbild", equalized_image)
cv2.waitKey(0)
cv2.destroyAllWindows()
Histogrammvergleich
OpenCV stellt die Funktion cv2.compareHist() zum Vergleichen der Ähnlichkeit zweier Histogramme bereit.
Syntax:
similarity = cv2.compareHist(hist1, hist2, method)
hist1: Das erste Histogramm.hist2: Das zweite Histogramm.method: Vergleichsmethode, zum Beispielcv2.HISTCMP_CORREL(Korrelationsvergleich).
Beispiel
hist1 = cv2.calcHist([image1], [0], None, [256], [0, 256])
hist2 = cv2.calcHist([image2], [0], None, [256], [0, 256])
# Vergleiche Histogramme
similarity = cv2.compareHist(hist1, hist2, cv2.HISTCMP_CORREL)
print("Histogramm-Ähnlichkeit:", similarity)
Anwendungen von Histogrammen
- Bildverbesserung: Durch Histogrammäqualisation kann der Kontrast eines Bildes verbessert werden, wodurch Details klarer werden.
- Bildsegmentierung: Durch Analyse des Histogramms kann ein Schwellenwert für die Bildsegmentierung bestimmt werden.
- Bildabgleich: Durch den Vergleich von Histogrammen kann die Ähnlichkeit zweier Bilder bestimmt werden, was für Bildabgleich und -wiederauffindung verwendet wird.
- Farbanalyse: Durch Farbhistogramme kann die Farbverteilung eines Bildes für die Farbkorrektur und Stilisierungsverarbeitung analysiert werden.
Das Folgende ist ein vollständiger Beispielcode für die Histogrammberechnung und -äqualisation:
Beispiel
import numpy as np
import matplotlib.pyplot as plt
# Graustufenbild einlesen
image = cv2.imread("path/to/image", cv2.IMREAD_GRAYSCALE)
# Graustufenhistogramm berechnen
hist = cv2.calcHist([image], [0], None, [256], [0, 256])
# Histogramm zeichnen
plt.plot(hist)
plt.title("Graustufenhistogramm")
plt.xlabel("Pixelintensität")
plt.ylabel("Pixelanzahl")
plt.show()
# Histogramm-Equalisierung
equalized_image = cv2.equalizeHist(image)
# Ergebnis anzeigen
cv2.imshow("Equalisiertes Bild", equalized_image)
cv2.waitKey(0)
cv2.destroyAllWindows()