Skip to content

Lire et enregistrer des fichiers images avec Python, OpenCV (imread, imwrite)

En Python et OpenCV, vous pouvez lire (charger) et écrire (enregistrer) des fichiers image avec cv2.imread() et cv2.imwrite(). Les images sont lues en tant que tableau NumPy ndarray.

Cet article décrit le contenu suivant.

  • Lire et écrire des images en couleur (BGR)
    • Lire un fichier image avec cv2.imread()
    • Écrivez ndarray en tant que fichier image avec cv2.imwrite()
  • Lire et écrire des images en niveaux de gris
    • Lire un fichier image avec cv2.imread()
    • Écrivez ndarray en tant que fichier image avec cv2.imwrite()
  • Remarques sur cv2.imread()
    • cv2.imread() ne lève pas d’exception
    • Bibliothèque JPEG
  • Si les images ne peuvent pas être lues avec cv2.imread()
    • Vérifier le répertoire courant
    • Formats pris en charge pour cv2.imread()

Il est également possible de lire des fichiers image en tant que ndarray en utilisant Pillow au lieu d’OpenCV.

L’image suivante est utilisée comme exemple.

avec

Lire et écrire des images en couleur (BGR)

Lire un fichier image avec cv2.imread()

Les fichiers d’image couleur sont lus comme un ndarray 3D de ligne (hauteur) x colonne (largeur) x couleur (3).

import cv2

im = cv2.imread('data/src/lena.jpg')

print(type(im))
# 

print(im.shape)
# (225, 400, 3)

print(im.dtype)
# uint8

Notez que l’ordre des couleurs est BGR au lieu de RVB. Par exemple, réglez 0e (B : bleu) et 1er (G : vert) sur 0 (noir).

Léna rouge

Si vous souhaitez convertir BGR et RVB, veuillez vous référer à l’article suivant.

Écrivez ndarray en tant que fichier image avec cv2.imwrite()

Pour enregistrer ndarray en tant que fichier image, définissez le chemin du fichier et l’objet ndarray sur cv2.imwrite().

Le format du fichier image est automatiquement déterminé à partir de l’extension du chemin du fichier. S’il s’agit de .jpg, il est enregistré au format JPEG, et s’il s’agit de .png, il est enregistré au format PNG.

cv2.imwrite('data/dst/lena_opencv_red.jpg', im)

Léna rouge

Des paramètres spécifiques au format peuvent être spécifiés pour le troisième paramètre. Spécifiez avec une liste comme [paramId_1, paramValue_1, paramId_2, paramValue_2, …].

Pour le paramètre ID (drapeau), reportez-vous au document officiel ci-dessous.

Par exemple, la qualité de JPEG est spécifiée par cv2.IMWRITE_JPEG_QUALITY. 0 est le plus bas et 100 est le plus élevé, la valeur par défaut est 95.

Si enregistré sous 50 :

cv2.imwrite('data/dst/lena_opencv_red_low.jpg', im, [cv2.IMWRITE_JPEG_QUALITY, 50])

lena rouge de mauvaise qualité

Si enregistré sous 100 :

cv2.imwrite('data/dst/lena_opencv_red_high.jpg', im, [cv2.IMWRITE_JPEG_QUALITY, 100])

lena rouge de haute qualité

Notez que JPEG est une compression avec perte, donc même s’il s’agit de la plus haute qualité 100, lorsque l’image enregistrée est rechargée, une différence se produit avec la valeur de pixel d’origine. Si vous souhaitez enregistrer l’image d’origine telle quelle, enregistrez-la au format PNG ou BMP.

Lire et écrire des images en niveaux de gris

Lire un fichier image avec cv2.imread()

En passant cv2.IMREAD_GRAYSCALE comme deuxième argument de cv2.imread(), un fichier image couleur peut être lu en niveaux de gris (noir et blanc). Puisque cv2.IMREAD_GRAYSCALE est équivalent à 0, même passer 0 est OK.

Il est utile pour détecter les bords et d’autres situations où les informations de couleur ne sont pas nécessaires.

Dans ce cas, l’image est lue comme ndarray 2D de ligne (hauteur) x colonne (largeur).

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

Vous pouvez lire le fichier image en couleur et le convertir en niveaux de gris avec cv2.cvtColor() et cv2.COLOR_BGR2GRAY.

Étant donné que cv2.IMREAD_GRAYSCALE avec cv2.imread() effectue des conversions dépendantes du codec au lieu des conversions implémentées par OpenCV, vous pouvez obtenir des résultats différents sur différentes plates-formes. cv2.cvtColor() avec cv2.COLOR_BGR2GRAY est plus sûr à utiliser si vous souhaitez gérer strictement les valeurs de pixel.

Écrivez ndarray en tant que fichier image avec cv2.imwrite()

Si 2D ndarray of row(height) x column(width) est spécifié comme argument de cv2.imwrite(), il est enregistré en tant que fichier image en niveaux de gris.

cv2.imwrite('data/dst/lena_opencv_gray.jpg', im_gray)

lena gris

Si vous souhaitez enregistrer une image couleur (ndarray 3D) en tant que fichier image en niveaux de gris, convertissez-la en niveaux de gris avec cv2.cvtColor() et cv2.COLOR_BGR2GRAY.

Si vous enregistrez un ndarray 2D dans un fichier et que vous le relisez avec cv2.imread(), il sera lu comme un ndarray 3D dans lequel chaque couleur a la même valeur.

Il ne lit pas automatiquement en tant que tableau à deux dimensions.

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

Remarques sur cv2.imread()

cv2.imread() ne lève pas d’exception

Même si un chemin inexistant est spécifié, cv2.imread() ne lève pas d’exception et renvoie None. Une erreur sera générée lorsqu’un utilisateur effectuera une opération en supposant qu’elle est lue en tant que ndarray.

im = cv2.imread('xxxxxxx')

print(im)
# None

# print(im.shape)
# AttributeError: 'NoneType' object has no attribute 'shape'

Même si le fichier existe, None est renvoyé si OpenCV ne le prend pas en charge.

im = cv2.imread('data/src/sample.csv')

print(im)
# None

Étant donné que None est considéré comme False, vous pouvez vérifier si l’image a été chargée correctement comme suit.

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.

Bibliothèque JPEG

Comme vous pouvez le voir dans le problème GitHub ci-dessous, la bibliothèque utilisée pour traiter les JPEG dépend de la version, de la plate-forme, etc. d’OpenCV. Par conséquent, même si le même fichier est lu, il peut y avoir des différences dans les valeurs si l’environnement est différent.

La lecture des images JPEG n’est pas une opération au bit près. Cela dépend de la bibliothèque utilisée (libjpeg/libjpeg-turbo) et/ou des versions, des plateformes (x86/ARM), des options du compilateur.
imread et imwrite provoquent des différences dans les pixels de l’image · Problème #10887 · opencv/opencv

Si les images ne peuvent pas être lues avec cv2.imread()

Vérifier le répertoire courant

Comme la fonction intégrée open(), avec cv2.imread() et cv2.imwrite(), vous pouvez spécifier le chemin d’un fichier avec l’une des méthodes suivantes :

  • Chemin relatif depuis le répertoire courant
  • Chemin absolu

Si le fichier doit s’y trouver mais qu’il ne peut pas être lu, c’est souvent à cause d’une simple erreur que le répertoire courant est différent de celui attendu.

Vous pouvez vérifier le répertoire courant avec os.getcwd().

Formats pris en charge pour cv2.imread()

Bien sûr, les fichiers image dans des formats non pris en charge par OpenCV ne peuvent pas être lus.

Les formats suivants sont pris en charge par cv2.imread() d’OpenCV 4.2.0. Voir aussi les notes sur le lien.

  • Bitmaps Windows – .bmp, .dib (toujours pris en charge)
  • Fichiers JPEG – .jpeg, .jpg, *.jpe (voir la section Remarque)
  • Fichiers JPEG 2000 – *.jp2 (voir la section Remarque)
  • Portable Network Graphics – *.png (voir la section Remarque)
  • WebP – *.webp (voir la section Remarque)
  • Format d’image portable – .pbm, .pgm, .ppm .pxm, *.pnm (toujours pris en charge)
  • Fichiers PFM – *.pfm (voir la section Remarque)
  • Rasters solaires – .sr, .ras (toujours pris en charge)
  • Fichiers TIFF – .tiff, .tif (voir la section Remarque)
  • Fichiers image OpenEXR – *.exr (voir la section Remarque)
  • Radiance HDR – .hdr, .pic (toujours pris en charge)
  • Données géospatiales matricielles et vectorielles prises en charge par GDAL (voir la section Remarque)
    OpenCV : lecture et écriture de fichiers image

Voir ci-dessous pour les autres versions.

Vous pouvez vérifier les informations sur les bibliothèques, etc., dans la section Media I/O de cv2.getBuildInformation().

cv2.imread() vérifie le format d’un fichier par son contenu, pas par son extension. Si le fichier ne peut pas être lu, vérifiez si le fichier peut être lu par une autre application (vérifiez si le fichier n’est pas corrompu).

La fonction détermine le type d’une image par le contenu, et non par l’extension de fichier.
OpenCV : lecture et écriture de fichiers image