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:

MerkmalFunktionBeschreibung
Histogramm berechnencv2.calcHist()Das Histogramm eines Bildes berechnen.
Histogramm-Equalisierungcv2.equalizeHist()Bildkontrast verbessern.
Histogrammvergleichcv2.compareHist()Die Ähnlichkeit zweier Histogramme vergleichen.
Histogramm zeichnenmatplotlib.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 übergebenNone。
  • 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 aufTrue, 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 cv2
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

# Histogramm-Equalisierung
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

# Farbbild einlesen
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

# Kanäle aufteilen
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

# Berechne die Histogramme zweier Bilder
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 cv2
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()
Weitere Erweiterungen