Assignment Chef icon Assignment Chef
All German tutorials

Programming lesson

Frequenzfilter, Bildwiederherstellung und Datenkompression: Ein praktischer Leitfaden zur digitalen Bildverarbeitung mit Python und OpenCV

Lerne die Grundlagen der digitalen Bildverarbeitung: Frequenzfilterung, Bildwiederherstellung mit Mittelwert- und Medianfiltern sowie Huffman-Kompression. Mit praktischen Python/OpenCV-Beispielen und aktuellen Bezügen zu KI-Trends.

digitale Bildverarbeitung Python OpenCV Frequenzfilter idealer Tiefpassfilter OpenCV Bildwiederherstellung Medianfilter Salz-und-Pfeffer-Rauschen entfernen Huffman-Codierung Beispiel Kompressionsrate berechnen inverse Filterung Gauß DFT OpenCV Tutorial Bildverarbeitung Studium Python Bildverarbeitung Praxis OpenCV Bildfilterung verlustfreie Kompression Huffman KI Bildverarbeitung Trend Quantisierung JPEG Kompression

Einführung in die digitale Bildverarbeitung mit OpenCV

Die digitale Bildverarbeitung ist ein zentraler Bestandteil moderner Technologien – von der automatischen Gesichtserkennung in Smartphones bis hin zur medizinischen Bildgebung. In diesem Tutorial lernst du, wie du mit Python und OpenCV Bilder im Frequenzbereich filterst, verrauschte Bilder wiederherstellst und Datenkompression mittels Huffman-Codierung durchführst. Diese Techniken sind nicht nur für Studierende der Informatik relevant, sondern auch für alle, die sich für Bildverarbeitung, maschinelles Lernen oder KI-Anwendungen interessieren.

1. Filtern im Frequenzbereich

2D-DFT und Visualisierung von Leistungsspektrum und Phasenwinkel

Die diskrete Fourier-Transformation (DFT) wandelt ein Bild vom Orts- in den Frequenzbereich um. Mit cv2.dft() erhältst du ein komplexes Array, aus dem du das Leistungsspektrum (Betrag) und den Phasenwinkel extrahieren kannst. Das Leistungsspektrum zeigt, welche Frequenzanteile im Bild dominieren – niedrige Frequenzen entsprechen glatten Flächen, hohe Frequenzen Kanten und Details. Der Phasenwinkel enthält Informationen über die Position dieser Strukturen. In Zeiten von KI-generierten Bildern ist das Verständnis dieser Grundlagen essenziell, um zu verstehen, wie neuronale Netze Bilder analysieren.

Um das Leistungsspektrum zu visualisieren, verwendest du np.fft.fftshift(), um die Nullfrequenz in die Mitte zu verschieben, und berechnest den Betrag mit np.abs(). Für den Phasenwinkel nutzt du np.angle(). Ein Beispielcode-Auszug:

dft = cv2.dft(np.float32(img), flags=cv2.DFT_COMPLEX_OUTPUT)
dft_shift = np.fft.fftshift(dft)
magnitude = cv2.magnitude(dft_shift[:,:,0], dft_shift[:,:,1])
magnitude = 20 * np.log(magnitude + 1)
phase = cv2.phase(dft_shift[:,:,0], dft_shift[:,:,1])

Ideale Tiefpass- und Hochpassfilter

Mit einem idealen Tiefpassfilter (Cutoff-Frequenz 30) entfernst du hohe Frequenzen – das Bild wird weichgezeichnet, Details gehen verloren. Ein idealer Hochpassfilter tut das Gegenteil: Er unterdrückt niedrige Frequenzen, sodass nur Kanten und Rauschen übrig bleiben. In der Praxis sind ideale Filter wegen des Ringings (Überschwingern) oft ungeeignet. Stattdessen werden weiche Filter wie der Gauß-Filter bevorzugt. Ein aktuelles Beispiel: Bei der Bildverbesserung für KI-Modelle zur Objekterkennung werden häufig Gauß-Filter eingesetzt, um Artefakte zu vermeiden.

rows, cols = img.shape
crow, ccol = rows//2 , cols//2
mask = np.zeros((rows, cols, 2), np.uint8)
mask[crow-30:crow+30, ccol-30:ccol+30] = 1
# Tiefpass
fshift = dft_shift * mask
# Hochpass: mask = 1 - mask

2. Bildwiederherstellung

Salz-und-Pfeffer-Rauschen und Filterung

Salz-und-Pfeffer-Rauschen entsteht durch defekte Pixel und wird mit np.random simuliert. Zur Wiederherstellung eignen sich der arithmetische Mittelwertfilter (Mittelwert über 7x7 Nachbarschaft) und der Medianfilter. Der Medianfilter ist besonders effektiv gegen Impulsrauschen, da er Ausreißer ignoriert. Dies ist vergleichbar mit der Rauschunterdrückung in Smartphone-Kameras, die oft Medianfilter in ihrer Bildverarbeitungspipeline verwenden.

# Medianfilter mit OpenCV
restored_median = cv2.medianBlur(noisy_img, 7)
# Arithmetischer Mittelwertfilter (eigener Kernel)
kernel = np.ones((7,7), np.float32)/49
restored_mean = cv2.filter2D(noisy_img, -1, kernel)

Inverse Filterung bei Gaußscher Unschärfe

Wenn ein Bild durch eine Gaußsche Unschärfe degradiert wurde, kann die inverse Filterung das Bild näherungsweise wiederherstellen. Dabei wird das Fourier-Spektrum des degradierten Bildes durch die Übertragungsfunktion des Gaußfilters dividiert. Da dies bei Nullstellen problematisch ist, wird ein cutoff-Radius eingeführt. Ein kleiner Radius (z.B. 40) führt zu starkem Rauschen, ein größerer (110) liefert bessere Ergebnisse. Diese Methode wird in der Astronomie genutzt, um verwackelte Teleskopaufnahmen zu korrigieren.

# Inverse Filterung mit cutoff
H = np.load('gaussian_low_pass.npy')
F = cv2.dft(np.float32(degraded), flags=cv2.DFT_COMPLEX_OUTPUT)
F_shifted = np.fft.fftshift(F)
F_restored = np.zeros_like(F_shifted)
F_restored[:,:,0] = F_shifted[:,:,0] / (H + 1e-8)
F_restored[:,:,1] = F_shifted[:,:,1] / (H + 1e-8)
# Anwenden des cutoff-Radius (z.B. 40)
rows, cols = degraded.shape
crow, ccol = rows//2, cols//2
mask = np.zeros((rows, cols, 2), np.uint8)
mask[crow-40:crow+40, ccol-40:ccol+40] = 1
F_restored = F_restored * mask
img_restored = cv2.idft(np.fft.ifftshift(F_restored))

3. Datenkompression mit Huffman-Codierung

Huffman-Baum und Kompressionsrate

Huffman-Codierung ist ein verlustfreies Kompressionsverfahren, das häufigen Symbolen kurze Codes zuweist. Für den String 'AAABBCCCCCCCDDDAAAAA' erstellst du einen Baum: Zähle die Häufigkeiten (A: 8, B: 2, C: 7, D: 3), sortiere sie und kombiniere die kleinsten. Die resultierenden Codes könnten sein: A=1, C=00, D=010, B=011. Vor der Kompression benötigst du 20 Zeichen * 8 Bit = 160 Bit. Nach der Kompression: 8*1 + 2*3 + 7*2 + 3*3 = 8+6+14+9 = 37 Bit. Die Kompressionsrate beträgt 160/37 ≈ 4,32.

JPEG-ähnliche Kompression mit Quantisierung

In der Praxis wird Huffman-Codierung oft mit diskreter Kosinustransformation (DCT) kombiniert, wie bei JPEG. Mit dem bereitgestellten Code kannst du die Quantisierungstabelle anpassen, um die Dateigröße zu steuern. Eine gröbere Quantisierung (höhere Werte) reduziert die Dateigröße, aber auch die Bildqualität. Dies ist ein Balanceakt, den du bei der Entwicklung von Bildkompressionsalgorithmen berücksichtigen musst. Ein aktueller Trend: KI-basierte Kompressionsverfahren wie JPEG XL oder AVIF nutzen ähnliche Prinzipien, optimieren aber die Quantisierung mit neuronalen Netzen.

Fazit

Dieses Tutorial hat dir die grundlegenden Konzepte der digitalen Bildverarbeitung nähergebracht: Frequenzfilterung, Bildwiederherstellung und Datenkompression. Mit OpenCV und Python kannst du diese Techniken direkt anwenden. Die Beispiele zeigen, wie Theorie und Praxis zusammenhängen – egal ob du ein Studierendenprojekt bearbeitest oder dich auf eine Karriere in der Bildverarbeitung vorbereitest. Probiere die verschiedenen Filter aus und experimentiere mit den Parametern, um ein Gefühl für die Auswirkungen zu bekommen.