
In Python und OpenCV können Sie Bilddateien mit cv2.imread() und cv2.imwrite() lesen (laden) und schreiben (speichern). Bilder werden als NumPy-Array ndarray gelesen.
Dieser Artikel hat folgenden Inhalt.
- Bilder in Farbe lesen und schreiben (BGR)
- Lesen Sie eine Bilddatei mit cv2.imread()
- Schreiben Sie ndarray als Bilddatei mit cv2.imwrite()
- Bilder in Graustufen lesen und schreiben
- Lesen Sie eine Bilddatei mit cv2.imread()
- Schreiben Sie ndarray als Bilddatei mit cv2.imwrite()
- Hinweise zu cv2.imread()
- cv2.imread() löst keine Ausnahme aus
- JPEG-Bibliothek
- Wenn Bilder nicht mit cv2.imread() gelesen werden können
- Überprüfen Sie das aktuelle Verzeichnis
- Unterstützte Formate für cv2.imread()
Es ist auch möglich, Bilddateien als ndarray mit Pillow anstelle von OpenCV zu lesen.
Das Bild dient als Beispiel.
Bilder in Farbe lesen und schreiben (BGR)
Lesen Sie eine Bilddatei mit cv2.imread()
Farbbilddateien werden als 3D-Darray aus Zeile (Höhe) x Spalte (Breite) x Farbe (3) gelesen.
import cv2
im = cv2.imread('data/src/lena.jpg')
print(type(im))
#
print(im.shape)
# (225, 400, 3)
print(im.dtype)
# uint8
Beachten Sie, dass die Farbreihenfolge BGR statt RGB ist. Stellen Sie beispielsweise 0 (B: blau) und 1 (G: grün) auf 0 (schwarz) ein.
Wenn Sie BGR und RGB konvertieren möchten, lesen Sie bitte den folgenden Artikel.
Schreiben Sie ndarray als Bilddatei mit cv2.imwrite()
Um ndarray als Bilddatei zu speichern, setzen Sie den Dateipfad und das ndarray-Objekt auf cv2.imwrite().
Das Bilddateiformat WIRD automatisch aus der Dateipfaderweiterung ermittelt. Wenn es .jpg ist, WIRD es als JPEG gespeichert, und wenn es .png ist, WIRD es als PNG gespeichert.
cv2.imwrite('data/dst/lena_opencv_red.jpg', im)
Für den dritten Parameter können formatspezifische Parameter angegeben werden. Geben Sie mit einer Liste wie [paramId_1, paramValue_1, paramId_2, paramValue_2, …] an.
Informationen zur Parameter-ID (Flag) finden Sie im folgenden offiziellen Dokument.
Beispiel WIRD sterben Qualität von JPEG durch cv2.IMWRITE_JPEG_QUALITY angegeben. 0 ist die niedrigste und 100 die höchste, der Standardwert ist 95.
Wenn als 50 gespeichert:
cv2.imwrite('data/dst/lena_opencv_red_low.jpg', im, [cv2.IMWRITE_JPEG_QUALITY, 50])
Wenn als 100 gespeichert:
cv2.imwrite('data/dst/lena_opencv_red_high.jpg', im, [cv2.IMWRITE_JPEG_QUALITY, 100])
Beachten Sie, dass JPEG eine verlustbehaftete Komprimierung ist. Selbst wenn es sich um die höchste Qualität 100 erneut handelt, tritt beim Laden des digitalen Bildes ein Unterschied zum ursprünglichen Pixelwert auf. If SIE das Originalbild speichern möchten, speichern SIE es als PNG oder BMP.
Bilder in Graustufen lesen und schreiben
Lesen Sie eine Bilddatei mit cv2.imread()
Indem cv2.IMREAD_GRAYSCALE als zweites Argument von cv2.imread() übergeben WIRD, kann eine Farbbilddatei in Graustufen (schwarz und weiß) gelesen werden. Da cv2.IMREAD_GRAYSCALE äquivalent zu 0 ist, ist sogar das Übergeben von 0 in Ordnung.
Es ist nützlich, um Kanten und andere Situationen zu erkennen, in denen keine Farbinformationen erforderlich sind.
In diesem Fall wird das Bild als 2D-Array aus Zeile (Höhe) x Spalte (Breite) gelesen.
im_gray = cv2.imread('data/src/lena.jpg', cv2.IMREAD_GRAYSCALE)
# im_gray = cv2.imread('data/src/lena.jpg', 0)
print(type(im_gray))
#
print(im_gray.shape)
# (225, 400)
print(im_gray.dtype)
# uint8
Sie können die Bilddatei als Farbe lesen und mit cv2.cvtColor() und cv2.COLOR_BGR2GRAY in Graustufen umwandeln.
Da cv2.IMREAD_GRAYSCALE mit cv2.imread() Codec-abhängige Konvertierungen anstelle von OpenCV-implementierten Konvertierungen durchführt, erhalten Sie möglicherweise auf verschiedenen Plattformen unterschiedliche Ergebnisse. cv2.cvtColor() mit cv2.COLOR_BGR2GRAY ist sicherer zu verwenden, wenn Sie Pixelwerte stärker handhaben möchten.
Schreiben Sie ndarray als Bilddatei mit cv2.imwrite()
Wenn 2D ndarray von Zeile(Höhe) x Spalte(Breite) als Argument von cv2.imwrite() angegeben wird, WIRD es als Graustufenbilddatei gespeichert.
cv2.imwrite('data/dst/lena_opencv_gray.jpg', im_gray)
Wenn Sie ein Farbbild (3D-Narray) als Graustufen-Bilddatei speichern möchten, konvertieren Sie es mit cv2.cvtColor() und cv2.COLOR_BGR2GRAY in Graustufen.
Wenn SIE 2D-ndarray in einer Datei erneut speichern und mit cv2.imread() lesen, wird es als 3D-ndarray gelesen, in dem jede Farbe Wert hat.
Es wird nicht automatisch als zweidimensionales Array eingelesen.
im_gray_read = cv2.imread('data/dst/lena_opencv_gray.jpg')
print(im_gray_read.shape)
# (225, 400, 3)
import numpy as np
print(np.array_equal(im_gray_read[:, :, 0], im_gray_read[:, :, 1]))
# True
print(np.array_equal(im_gray_read[:, :, 1], im_gray_read[:, :, 2]))
# True
Hinweise zu cv2.imread()
cv2.imread() löst keine Ausnahme aus
Selbst wenn ein nicht vorhandener Pfad angegeben WIRD, löst cv2.imread() keine Ausnahme aus und gibt None zurück. Ein Fehler wird ausgelöst, wenn ein Benutzer eine Operation ausführt, vorausgesetzt, sie wird als ndarray gelesen.
im = cv2.imread('xxxxxxx')
print(im)
# None
# print(im.shape)
# AttributeError: 'NoneType' object has no attribute 'shape'
Auch wenn die Datei vorhanden ist, wird None zurückgegeben, wenn OpenCV sie nicht unterstützt.
im = cv2.imread('data/src/sample.csv')
print(im)
# None
Da None als False gewertet WIRD, can SIE wie folgt prüfen, ob das Bild korrekt geladen wurde.
im = cv2.imread('xxxxxxx')
if im:
print('Image is read.')
else:
print('Image is not read.')
# Image is not read.
im = cv2.imread('xxxxxxx')
if not im:
print('Image is not read.')
else:
print('Image is read.')
# Image is not read.
JPEG-Bibliothek
Wie Sie in der GitHub-Ausgabe unten sehen können, hängt die zum Verarbeiten von JPEGs verwendete Bibliothek von der OpenCV-Version, Plattform usw. ab. Daher can, selbst wenn dieselbe Datei gelesen WIRD, Unterschiede in den Werten auftreten, wenn sterben unterschiedliche Umgebung ist.
Das Lesen von JPEG-Bildern ist keine bitgenaue Operation. Es hängt von der verwendeten Bibliothek (libjpeg/libjpeg-turbo) und/oder Versionen, Plattformen (x86/ARM), Compiler-Optionen ab.
imread und imwrite verursachen Unterschiede in den Bildpixeln · Issue #10887 · opencv/opencv
Wenn Bilder nicht mit cv2.imread() gelesen werden können
Überprüfen Sie das aktuelle Verzeichnis
Wie bei der eingebauten Funktion open() können SIE mit cv2.imread() und cv2.imwrite() den Pfad einer Datei mit einer der folgenden Methoden angeben:
- Relativer Pfad aus dem aktuellen Verzeichnis
- Absoluter Pfad
Wenn die Datei vorhanden sein sollte, aber nicht gelesen werden kann, liegt es oft an einem einfachen Fehler, dass das aktuelle Verzeichnis anders als erwartet ist.
Sie können das aktuelle Verzeichnis mit os.getcwd() überprüfen.
Unterstützte Formate für cv2.imread()
Natürlich can Bilddateien in Formaten, die von OpenCV nicht unterstützt werden, nicht gelesen werden.
Die folgenden Formate werden von cv2.imread() von OpenCV 4.2.0 unterstützt. Siehe auch die Hinweise unter dem Link.
- Windows-Bitmaps – .bmp, .dib (immer unterstützt)
- JPEG-Dateien – .jpeg, .jpg, *.jpe (siehe Abschnitt Hinweis)
- JPEG 2000-Dateien – *.jp2 (siehe Abschnitt Hinweis)
- Portable Netzwerkgrafiken – *.png (siehe Abschnitt Hinweis)
- WebP – *.webp (siehe Abschnitt Hinweis)
- Portables Bildformat – .pbm, .pgm, .ppm .pxm, *.pnm (immer unterstützt)
- PFM-Dateien – *.pfm (siehe Abschnitt Hinweis)
- Sonnenraster – .sr, .ras (immer unterstützt)
- TIFF-Dateien – .tiff, .tif (siehe Abschnitt Hinweis)
- OpenEXR-Bilddateien – *.exr (siehe Abschnitt Hinweis)
- Radiance HDR – .hdr, .pic (immer unterstützt)
- Raster- und Vektor-Geodaten werden von GDAL unterstützt (siehe Abschnitt Hinweis)
OpenCV: Lesen und Schreiben von Bilddateien
Siehe unten für andere Versionen.
Sie können Informationen über Bibliotheken usw. im Media I/O-Abschnitt von cv2.getBuildInformation() überprüfen.
cv2.imread() überprüft das Format einer Datei nach ihrem Inhalt, nicht nach ihrer Erweiterung. Wenn die Datei nicht gelesen werden kann, überprüfen Sie, ob die Datei von einer anderen Anwendung gelesen werden kann (überprüfen Sie, ob die Datei nicht beschädigt ist).
Die Funktion bestimmt den Typ eines Bildes anhand des Inhalts, nicht anhand der Dateiendung.
OpenCV: Lesen und Schreiben von Bilddateien