Les images sont des tableaux de nombres#

Numpy est une bibliothèque pour traiter des listes multidimensionnelles de nombres, dont les images de microscopie (piles, multi-canaux, séquences temporelles, etc.) sont un exemple notable. Nous donnons ici une introduction à cette bibliothèque.

Voir aussi

import numpy as np
from matplotlib.pyplot import imshow

Tableaux Numpy#

Une image n’est qu’une liste bidimensionnelle de valeurs de pixels, en d’autres termes une matrice, avec un certain nombre de lignes et de colonnes. Par conséquent, nous pouvons la définir comme une liste de listes, chaque liste étant une rangée de pixels :

raw_image_array = [
    [1, 0, 2, 1, 0, 0, 0],
    [0, 3, 1, 0, 1, 0, 1],
    [0, 5, 5, 1, 0, 1, 0],
    [0, 6, 6, 5, 1, 0, 2],
    [0, 0, 5, 6, 3, 0, 1],
    [0, 1, 2, 1, 0, 0, 1],
    [1, 0, 1, 0, 0, 1, 0]
]
raw_image_array
[[1, 0, 2, 1, 0, 0, 0],
 [0, 3, 1, 0, 1, 0, 1],
 [0, 5, 5, 1, 0, 1, 0],
 [0, 6, 6, 5, 1, 0, 2],
 [0, 0, 5, 6, 3, 0, 1],
 [0, 1, 2, 1, 0, 0, 1],
 [1, 0, 1, 0, 0, 1, 0]]
imshow(raw_image_array)
<matplotlib.image.AxesImage at 0x1f9fbdb4b80>
../_images/33579b8adbd4882cc6a8cf342ee2d65b004107c04199c41a019e636cdd7d5fc6.png

Cette sortie est presque identique à celle ci-dessus, à la différence près qu’il est maintenant indiqué que nous traitons un array Numpy. Ces tableaux Numpy peuvent maintenant être traités comme une seule entité et nous pouvons effectuer les calculs que nous ne pouvions pas faire auparavant :

image = np.asarray(raw_image_array)
image - 2
array([[-1, -2,  0, -1, -2, -2, -2],
       [-2,  1, -1, -2, -1, -2, -1],
       [-2,  3,  3, -1, -2, -1, -2],
       [-2,  4,  4,  3, -1, -2,  0],
       [-2, -2,  3,  4,  1, -2, -1],
       [-2, -1,  0, -1, -2, -2, -1],
       [-1, -2, -1, -2, -2, -1, -2]])

Notez que ces calculs sont très efficaces car ils sont vectorisés, c’est-à-dire qu’ils peuvent en principe être effectués en parallèle.

Deux propriétés importantes#

Les tableaux comme image ont différentes propriétés. Deux des plus importantes sont :

  • la shape du tableau, c’est-à-dire le nombre de lignes, de colonnes (et de canaux, de plans, etc. pour les images multidimensionnelles)

  • le dtype du tableau, c’est-à-dire qu’une image de type int64 a 2 à la puissance 64 valeurs de gris différentes.

image.shape
(7, 7)
image.dtype
dtype('int32')

Autres façons de créer des tableaux#

Lorsque nous travaillons avec des images, nous créons souvent des images artificielles pour voir ce que les filtres leur font. Par exemple, nous pouvons créer une image où tous les pixels ont la valeur 0 sauf un seul en utilisant la fonction Numpy np.zeros. Elle nécessite de spécifier une taille d’image.

image_size = (6, 5)

image1 = np.zeros(image_size)
image1
array([[0., 0., 0., 0., 0.],
       [0., 0., 0., 0., 0.],
       [0., 0., 0., 0., 0.],
       [0., 0., 0., 0., 0.],
       [0., 0., 0., 0., 0.],
       [0., 0., 0., 0., 0.]])
imshow(image1)
<matplotlib.image.AxesImage at 0x1f9fc000f10>
../_images/09ab260b13e1180841a9b181822ccdb5209c5d97e5dc706f824ab54453d51510.png

Comme les images ne sont que des tableaux, nous définissons simplement les valeurs des pixels comme si nous accédions à des tableaux. De cela, vous apprenez également que le premier axe (coordonnée 0) va de haut en bas tandis que le deuxième axe (coordonnée 3) va de gauche à droite.

image1[0,3] = 1

imshow(image1)
<matplotlib.image.AxesImage at 0x1f9fbe7ad90>
../_images/6c0bf2b62d8284502bf59c08097c2d117beb30ee0ab6ec71ee180f0b186cf857.png

Pour étudier le bruit, nous pouvons par exemple créer une image avec des valeurs aléatoires en utilisant np.random.random.

image_random = np.random.random((6, 5))
imshow(image_random)
<matplotlib.image.AxesImage at 0x1f9fbef72e0>
../_images/285da33e574aa7a0a1b7dd67933652ded803861171b3da6713e7cb11154f2dae.png