---
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)
```