> Modules non standards > OpenCV > Lecture et sauvegarde des images
Lecture et sauvegarde des images
Sous jupyter :
from matplotlib import pyplot
%matplotlib inline
pyplot.imshow(myImage[:,:,::-1]) # Car les couleurs sont BGR sous opencv et RGB sous matplotlib
permet d'afficher directement une image à partir d'un fichier.
Lecture et sauvegarde d'une image :
- les images sont en général des array numpy de type uint8 (valeurs entre 0 et 255)
- import cv2; img = cv2.imread('myImage.jpg', cv2.IMREAD_COLOR) ou simplement img = cv2.imread('myImage.jpg'): charge une image en couleur sous forme d'array numpy de type uint8 (valeurs entre 0 et 255) de dimensions (hauteur, largeur, 3) (si pas d'image, renvoie None). cv2.IMREAD_COLOR vaut 1 et est la valeur du flag par défaut.
- img = cv2.imread('myImage.jpg', cv2.IMREAD_GRAYSCALE) : charge une image en niveaux de gris, même si l'image dans le fichier était en couleurs. La dimension est alors (hauteur, largeur). cv2.IMREAD_GRAYSCALE vaut en fait 0.
- cv2.imshow('myImage', img); cv2.waitKey(2000); cv2.destroyImage('myImage') : affiche l'image pendant 2000 ms et si on tape une touche pendant cette période, la referme ensuite (attention, waitKey est indispensable pour afficher l'image). PROBLEME SUR destroyAllWindows !!!
- si on utilise cv2.waitKey(0) : attend indéfiniment jusqu'à ce qu'on tape une touche.
- cv2.imwrite('myImage.png', img) : sauvegarde l'image dans le fichier donné, et avec le format indiqué par l'extension.
- Attention : les images en couleurs sont en BGR et non RGB ! Donc, elles ne seront pas affichées correctement avec matplotlib ! Si on veut les afficher avec matplotlib, il faut faire : img = img[:,:,::-1]; pyplot.imshow(img); pyplot.show()
Image utilisé ici pour les exemples :
newImg = img
Manipulations élémentaires d'une image :
- img.shape, img.size, img.dtype : donnent les dimensions, le nombre total de pixel et le type de données de l'image, comme pour n'importe quelle array numpy.
- img[50, 50] : pixel aux coordonnées. C'est un triplet pour une image couleur, coordonnées ligne puis colonne, origine à 0.
- img[50, 50, 0] : pour une image couleur, donne la valeur de bleu (image BRG).
- img.item(50, 50, 0) : pour une image couleur, donne la valeur de bleu (image BGR), mais l'indice de couleur est requis ici.
- img[50, 50] = (0, 255, 255) : fixe la valeur d'un pixel (pour image couleur).
- img.itemset((50, 50, 1), 25) : fixe la valeur d'un pixel pour une couleur donnée, ici vert.
- img[100:150,100:150] = img[300:350,400:450] : recopie d'une portion de l'image à un autre endroit.
- (b, g, r) = cv2.split(img) : permet d'avoir des 3 canaux correspondant à B, G et R (arrays 2d) si image BGR.
- img = cv2.merge((b, g, r)) : opération inverse pour reconstituer une image en couleurs.
- newImg = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) : convertit une image couleur en image niveau de gris.
- newImg = cv2.cvtColor(img, cv2.COLOR_BGR2HSV) : convertit une image BGR en image HSV. On peut alors faire ensuite : (h, s, v) = cv2.split(newImg)
- autres flags : il y a notamment :
- cv2.COLOR_BGR2RGB et cv2.COLOR_RGB2BGR : conversion entre les 2 conventions BGR et RGB
- cv2.COLOR_BGR2XYZ : vers CIE XYZ
- cv2.COLOR_XYZ2BGR : de CIE XYZ vers BGR.
- cv2.COLOR_BGR2YCrCb : vers YCC.
- cv2.COLOR_BGR2Lab : vers CIE Lab
- et beaucoup d'autres ...
- toutes les méthodes de conversions peuvent être listées par : filter(lambda x: x.startswith('COLOR_'), dir(cv2)) (plus d'une centaine !)
- crop d'une image : newImg = img[0:100,0:100]
Création d'une image vide (noire) :
- newImg = numpy.empty((height, width, 3), dtype = numpy.uint8)
- on peut rendre l'image blanche avec newImg[:,:,:] = 255
Conversion d'une image couleur en niveau de gris :
newImg = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
Récupération d'un canal, ici le canal bleu :
newImg = cv2.split(img)[0]
Opérations arithmétiques sur les images :
- newImg = cv2.add(img1, img2) : fait l'ajout de 2 images, en se limitant à 255 comme intensité (i.e., 150 + 150 = 255)
- img3 = cv2.addWeighted(img1, 0.2, img2, 0.8, 0) : ajoute les images selon la formule : 0.2 * img1 + 0.8 * img2 + 0 (fusion d'images).
- newImg = cv2.subtract(img1, img2) : soustrait une image à une autre.
- newImg = cv2.bitwise_not(img) : inversion d'une image noir et blanc (binaire).
Copyright python-simple.com
programmer en python, tutoriel python, graphes en python, Aymeric Duclert