762 views
--- title: VISI601_CMI Images en Python (numpy,matplotlib) --- # Images en Python (numpy,matplotlib) > [name=Jacques-Olivier Lachaud][time=February 2022][color=#907bf7] > (Les images peuvent être soumises à des droits d'auteur. Elles sont utilisées ici exclusivement dans un but pédagogique) ###### tags: `visi601` Retour à [VISI601_CMI (Main) Algorithmique numérique](https://codimd.math.cnrs.fr/s/IWTaBkA9m) --- [TOC] --- ## Préalables Il faut avoir installer `numpy` et `matplotlib`. C'est dans toutes les configurations de base python "scientifique", genre anaconda. Ensuite, il faut importer les modules: ```python= import numpy as np import random as rd import matplotlib.pyplot as plt # si vous voulez plus d'algorithmes de traitement d'image import matplotlib.image as mpimg ``` ## Charger ou sauvegarder une image On utilise `plt.imread` et `plt.imsave` ```python= # lit une image couleur de largeur w et de hauteur h # retourne un numpy.array de taille h x w x 3 img = plt.imread('exemple-1.png') red = img[:, :, 0] # composante rouge green = img[:, :, 1] # composante verte blue = img[:, :, 2] # composante bleue ``` On peut ensuite manipuler chaque composante couleur comme un tableau bidimensionnel de valeurs réelles. On note que les valeurs sont ramenées entre 0.0 et 1.0. Le blanc correspond donc à (1.0, 1.0, 1.0). L'exemple suivant fait la moyenne des composantes et sauve une image couleur en mettant une colormap 'hot'. ```python= gray = (red+green+blue)/3.0 plt.imsave("exemple-1-gray.png", gray, cmap='hot') ``` ## Afficher une image On utilise `plt.imshow(...)`, éventuellement suivi de `plt.show()` lorsqu'on exécute un programme python en console. ```python= # affiche l'image couleur plt.imshow(img) # affiche la composante rouge comme du niveau de gris, # en forçant le 0 comme étant noir et le 1 comme du blanc. plt.imshow(red,cmap='gray',vmin=0.,vmax=1.) # Eventuellement pour forcer l'affichage plt.show() ``` ## Utiliser une image Une image est un tableau `numpy.array`, 3D si c'est une image couleur (taille H x W x 3) ou 2D si c'est une image en niveaux de gris (taille H x W). On utilise donc les notations spéciales de python pour les indices dans les tableaux pour accéder à un élément, des lignes, colonnes, blocs, etc: ```python= img[i,j] # accès au pixel ligne i, colonne j, un tableau de taille 3 img[i][j] # accès au pixel ligne i, colonne j (aussi) img[i] # accès à toute la ligne i, donc un tableau W x 3 red[i] # accès à toute la ligne i, donc un tableau W red[:,j] # accès à toute la colonne j, donc un tableau H x 3 red[0:H/2,0:W/2] # accès au quart supérieur gauche ``` ## Fusionner trois images N&B pour faire une image couleur Souvent on travaille sur les 3 canaux de couleur séparément (RGB), puis on fusionne les 3 canaux. Un moyen simple est d'utiliser `numpy.stack`: ```python= img_color = np.stack((red,green,blue), axis=2) ```