Bildkomprimierung ist eine entscheidende Technologie in der Bildverarbeitung, die es uns ermöglicht, Bilder effizienter zu speichern und zu übertragen und gleichzeitig die visuelle Qualität beizubehalten. Im Idealfall hätten wir gerne kleine Dateien mit bester Qualität. Wir müssen jedoch einen Kompromiss eingehen und entscheiden, was wichtiger ist.
Dieses Tutorial vermittelt die Bildkomprimierung mit OpenCV und deckt Theorie und praktische Anwendungen ab. Am Ende werden Sie verstehen, wie Sie Fotos für Computer-Vision-Projekte (oder andere Projekte, die Sie möglicherweise haben) erfolgreich komprimieren.
Durch die Bildkomprimierung wird die Dateigröße eines Bildes reduziert und gleichzeitig ein akzeptables Maß an visueller Qualität beibehalten. Es gibt zwei Hauptarten der Komprimierung:
Wenn „Speicherplatz billig ist“, wie wir oft hören, warum dann überhaupt Bilder komprimieren? Im Kleinen spielt die Bildkomprimierung keine große Rolle, im Großen ist sie jedoch von entscheidender Bedeutung.
Wenn Sie beispielsweise ein paar Bilder auf Ihrer Festplatte haben, können Sie diese komprimieren und so ein paar Megabyte an Daten sparen. Dies hat keine große Auswirkung, wenn Festplatten in Terabyte gemessen werden. Aber was wäre, wenn Sie 100.000 Bilder auf Ihrer Festplatte hätten? Eine einfache Komprimierung spart Zeit und Geld. Aus leistungstechnischer Sicht ist es dasselbe. Wenn Sie eine Website mit vielen Bildern haben und täglich 10.000 Menschen Ihre Website besuchen, ist die Komprimierung wichtig.
Hier ist der Grund, warum wir es tun:
Bildkomprimierungstechniken nutzen zwei Arten von Redundanzen:
Räumliche Redundanz nutzt die Tatsache aus, dass benachbarte Pixel in den meisten natürlichen Bildern tendenziell ähnliche Werte haben. Dadurch entstehen fließende Übergänge. Viele Fotos „sehen echt aus“, weil es einen natürlichen Übergang von einem Bereich zum anderen gibt. Wenn die benachbarten Pixel stark unterschiedliche Werte haben, entstehen „verrauschte“ Bilder. Die Pixel wurden geändert, um diese Übergänge weniger „glatt“ zu machen, indem Pixel in einer einzigen Farbe gruppiert wurden, wodurch das Bild kleiner wurde.
Farbredundanz hingegen konzentriert sich darauf, wie benachbarte Bereiche in einem Bild häufig ähnliche Farben aufweisen. Stellen Sie sich einen blauen Himmel oder eine grüne Wiese vor – große Teile des Bildes könnten sehr ähnliche Farbwerte haben. Sie können auch gruppiert und in einer einzigen Farbe gestaltet werden, um Platz zu sparen.
OpenCV bietet solide Werkzeuge für die Arbeit mit diesen Ideen. Mithilfe räumlicher Redundanz füllt beispielsweise die Funktion cv2.inpaint() von OpenCV fehlende oder beschädigte Bereiche eines Bildes mithilfe von Informationen aus benachbarten Pixeln auf. Mit OpenCV können Entwickler cv2.cvtColor() verwenden, um Bilder zwischen mehreren Farbräumen hinsichtlich der Farbredundanz zu übersetzen. Dies kann als Vorverarbeitungsschritt bei vielen Komprimierungstechniken einigermaßen hilfreich sein, da einige Farbräume bei der Kodierung bestimmter Bildarten effektiver sind als andere.
Wir werden jetzt einige dieser Theorien testen. Lass uns damit spielen.
Sehen wir uns an, wie man Bilder mit den Python-Bindungen von OpenCV komprimiert. Schreiben Sie diesen Code aus oder kopieren Sie ihn:
Den Quellcode erhalten Sie auch hier
import cv2 import numpy as np def compress_image(image_path, quality=90): # Read the image img = cv2.imread(image_path) # Encode the image with JPEG compression encode_param = [int(cv2.IMWRITE_JPEG_QUALITY), quality] _, encoded_img = cv2.imencode('.jpg', img, encode_param) # Decode the compressed image decoded_img = cv2.imdecode(encoded_img, cv2.IMREAD_COLOR) return decoded_img # Example usage original_img = cv2.imread('original_image.jpg') compressed_img = compress_image('original_image.jpg', quality=50) # Display results cv2.imshow('Original', original_img) cv2.imshow('Compressed', compressed_img) cv2.waitKey(0) cv2.destroyAllWindows() # Calculate compression ratio original_size = original_img.nbytes compressed_size = compressed_img.nbytes compression_ratio = original_size / compressed_size print(f"Compression ratio: {compression_ratio:.2f}")
Dieses Beispiel enthält eine compress_image-Funktion, die zwei Parameter akzeptiert:
Dann laden wir das Originalbild in original_img. Anschließend komprimieren wir dasselbe Bild um 50 % und laden es in eine neue Instanz, compress_image.
Dann zeigen wir das Original und das komprimierte Bild, damit Sie sie nebeneinander betrachten können.
Wir berechnen dann das Komprimierungsverhältnis und zeigen es an.
Dieses Beispiel zeigt, wie man ein Bild mithilfe der JPEG-Komprimierung in OpenCV komprimiert. Der Qualitätsparameter steuert den Kompromiss zwischen Dateigröße und Bildqualität.
Lass es uns ausführen:
Beim ersten Betrachten der Bilder erkennt man kaum einen Unterschied. Wenn Sie jedoch hineinzoomen, sehen Sie den Unterschied in der Qualität:
Und nachdem wir die Fenster geschlossen und die Dateien betrachtet haben, können wir sehen, dass die Datei erheblich verkleinert wurde:
Außerdem können wir unsere Qualität auf 10 % ändern, wenn wir den Wert weiter senken.
compressed_img = compress_image('sampleimage.jpg', quality=10)
Und die Ergebnisse sind viel drastischer:
Und auch die Dateigrößenergebnisse sind drastischer:
Sie können diese Parameter ganz einfach anpassen und das gewünschte Gleichgewicht zwischen Qualität und Dateigröße erreichen.
Um die Auswirkung der Komprimierung zu bewerten, können wir Metriken verwenden wie:
Der mittlere quadratische Fehler (MSE) misst, wie unterschiedlich zwei Bilder voneinander sind. Wenn Sie ein Bild komprimieren, hilft Ihnen MSE dabei, festzustellen, wie stark sich das komprimierte Bild im Vergleich zum Original verändert hat.
Dies geschieht, indem die Unterschiede zwischen den Farben der entsprechenden Pixel in den beiden Bildern abgetastet, diese Unterschiede quadriert und gemittelt werden. Das Ergebnis ist eine einzelne Zahl: Ein niedrigerer MSE bedeutet, dass das komprimierte Bild näher am Original ist. Im Vergleich dazu bedeutet ein höherer MSE, dass es zu einem spürbareren Qualitätsverlust kommt.
Hier ist etwas Python-Code, um das zu messen:
def calculate_mse(img1, img2): return np.mean((img1 - img2) ** 2) mse = calculate_mse(original_img, compressed_img) print(f"Mean Squared Error: {mse:.2f}")
So sieht unsere Demo-Bildkomprimierung aus:
Das maximale Signal-Rausch-Verhältnis (PSNR) ist ein Maß, das angibt, wie stark sich die Qualität eines Bildes nach der Komprimierung verschlechtert hat. Dies ist oft mit bloßem Auge sichtbar, weist aber einen festgelegten Wert auf. Es vergleicht das Originalbild mit dem komprimierten Bild und drückt den Unterschied als Verhältnis aus.
Ein höherer PSNR-Wert bedeutet, dass die Qualität des komprimierten Bildes näher am Original liegt, was auf einen geringeren Qualitätsverlust hinweist. Ein niedrigerer PSNR bedeutet eine stärker sichtbare Verschlechterung. PSNR wird häufig zusammen mit MSE verwendet, wobei PSNR eine einfacher zu interpretierende Skala bietet, bei der höher besser ist.
Hier ist ein Python-Code, der das misst:
def calculate_psnr(img1, img2): mse = calculate_mse(img1, img2) if mse == 0: return float('inf') max_pixel = 255.0 return 20 * np.log10(max_pixel / np.sqrt(mse)) psnr = calculate_psnr(original_img, compressed_img) print(f"PSNR: {psnr:.2f} dB")
So sieht unsere Demo-Bildkomprimierung aus:
Es ist in Ordnung, Ihre Bilder nach der Komprimierung zu „beäugen“, um die Qualität zu bestimmen. Im großen Maßstab ist es jedoch viel einfacher, mit Skripten Standards festzulegen und sicherzustellen, dass die Bilder diesen entsprechen.
Sehen wir uns ein paar andere Techniken an:
Für eine erweiterte Komprimierung unterstützt OpenCV verschiedene Algorithmen:
Sie können Ihre Bilder in das PNG-Format konvertieren, was viele Vorteile hat. Verwenden Sie die folgende Codezeile und Sie können die Komprimierung je nach Bedarf zwischen 0 und 9 einstellen. 0 bedeutet keinerlei Komprimierung und 9 ist das Maximum. Beachten Sie, dass PNGs ein „verlustfreies“ Format sind, sodass das Bild auch bei maximaler Komprimierung intakt bleiben sollte. Der große Kompromiss besteht in der Dateigröße und der Komprimierungszeit.
Hier ist der Code zur Verwendung der PNG-Komprimierung mit OpenCV:
cv2.imwrite('compressed.png', img, [cv2.IMWRITE_PNG_COMPRESSION, 9])
Und hier ist unser Ergebnis:
Hinweis: Manchmal stellen Sie möglicherweise fest, dass PNG-Dateien tatsächlich größer sind, wie in diesem Fall. Es kommt auf den Inhalt des Bildes an.
Sie können Ihre Bilder auch in das .webp-Format konvertieren. Dies ist eine neuere Komprimierungsmethode, die immer beliebter wird. Ich verwende diese Komprimierung seit Jahren für die Bilder in meinem Blog.
Im folgenden Code können wir unser Bild in eine WebP-Datei schreiben und die Komprimierungsstufe von 0 bis 100 festlegen. Dies ist das Gegenteil der PNG-Skalierung, da 0, da wir stattdessen Qualität festlegen Kompression. Dieser kleine Unterschied ist wichtig, da die Einstellung 0 die niedrigstmögliche Qualität mit geringer Dateigröße und erheblichem Verlust darstellt. 100 ist die höchste Qualität, d. h. große Dateien mit der besten Bildqualität.
Hier ist der Python-Code, um das zu ermöglichen:
cv2.imwrite('compressed.webp', img, [cv2.IMWRITE_WEBP_QUALITY, 80])
Und hier ist unser Ergebnis:
Diese beiden Techniken eignen sich hervorragend zum Komprimieren großer Datenmengen. Sie können Skripte schreiben, um Tausende oder Hunderttausende Bilder automatisch zu komprimieren.
Bildkomprimierung ist fantastisch. Es ist in vielerlei Hinsicht für Computer-Vision-Aufgaben unerlässlich, insbesondere wenn es darum geht, Platz zu sparen oder die Verarbeitungsgeschwindigkeit zu erhöhen. Es gibt auch viele Anwendungsfälle außerhalb von Computer Vision, wenn Sie den Speicherplatz auf der Festplatte reduzieren oder Bandbreite sparen möchten. Bildkomprimierung kann sehr hilfreich sein.
Wenn Sie die Theorie dahinter verstehen und anwenden, können Sie mit Ihren Projekten einige wirkungsvolle Dinge bewirken.
Denken Sie daran, dass der Schlüssel zu einer effektiven Komprimierung darin besteht, den optimalen Kompromiss zwischen der Reduzierung der Dateigröße und der Beibehaltung einer akzeptablen visuellen Qualität für Ihre Anwendung zu finden.
Vielen Dank fürs Lesen. Wenn Sie Kommentare oder Fragen haben, können Sie sich jederzeit an uns wenden!
Haftungsausschluss: Alle bereitgestellten Ressourcen stammen teilweise aus dem Internet. Wenn eine Verletzung Ihres Urheberrechts oder anderer Rechte und Interessen vorliegt, erläutern Sie bitte die detaillierten Gründe und legen Sie einen Nachweis des Urheberrechts oder Ihrer Rechte und Interessen vor und senden Sie ihn dann an die E-Mail-Adresse: [email protected] Wir werden die Angelegenheit so schnell wie möglich für Sie erledigen.
Copyright© 2022 湘ICP备2022001581号-3