<jupyter_start><jupyter_text>Images<jupyter_code>import matplotlib.pyplot as plt
import numpy as np<jupyter_output><empty_output><jupyter_text>Charger une imagePour charger des images, nous importons la fonction `imread`.<jupyter_code>from matplotlib.image import imread<jupyter_output><empty_output><jupyter_text>La fonction `imread()` peut importer deux types d'images- en couleur (RGB)- en noir et blanc (0..255)Voici une image en couleur<jupyter_code>img = imread('img/Bachalpsee.jpg')
plt.imshow(img);<jupyter_output><empty_output><jupyter_text>Voici les dimensions de la matrice:- 188 pixelx en hauteur- 250 pixels en largeur- 3 octets pour définir une couleur<jupyter_code>img.shape<jupyter_output><empty_output><jupyter_text>Voici le pixel à la position (25, 25). C'est dans la région ciel et de couleur cyan. Les composant bleu et vert sont au maximum.<jupyter_code>img[25, 25]<jupyter_output><empty_output><jupyter_text>Indexer des pixelsNous pouvons extraire une tranche d'une image. Dans une matrice, le premier indice est l'axe vertical (y) et le deuxième indice l'axe horizontal (x).<jupyter_code>plt.imshow(img[70:120, 100:200]);<jupyter_output><empty_output><jupyter_text>Annoter l'imageNous pouvons superposer du texte à une image.<jupyter_code>plt.imshow(img);
plt.text(150, 25, 'peak', fontsize=16)
plt.text(100, 110, 'lake', fontsize=16);<jupyter_output><empty_output><jupyter_text>Afficher sans axesLa fonction `axis('off')` permet de ne pas afficher les axes.<jupyter_code>plt.imshow(img)
plt.axis('off');<jupyter_output><empty_output><jupyter_text>Noir et blancLes images noir-et-blancs sont affichées avec une **colormap**.<jupyter_code>img = imread('img/lake.jpg')
plt.imshow(img, cmap='gray');<jupyter_output><empty_output><jupyter_text>L'image est de taille 220x170 et du type `ndarray`.<jupyter_code>img.shape
type(img)<jupyter_output><empty_output><jupyter_text>Color mapsLes images en noir et blanc (niveaux de gris) peuvent être coloriées avec des colormaps.<jupyter_code>maps = ['winter', 'summer', 'autumn', 'gray']

plt.subplots(figsize=(8, 6))
for i in range(4):
    plt.subplot(2, 2, i+1)
    plt.imshow(img, cmap=maps[i])
    plt.axis('off')
    plt.title(maps[i])<jupyter_output><empty_output><jupyter_text>Barre des couleursLa fonction `colorbar()` affiche une barre de couleur qui indique la correspondance des valeurs numériques et des couleurs.<jupyter_code>plt.imshow(img, cmap='hot')
    plt.axis('off')
    plt.colorbar();
plt.imshow(img, cmap='terrain')
plt.colorbar();<jupyter_output><empty_output><jupyter_text>InverserPour inverser la direction de l'image, nous utilisons l'option `origin`.<jupyter_code>plt.imshow(img, origin='lower', cmap='hot');<jupyter_output><empty_output><jupyter_text>JuxtaposerAvec la commande `hstack` (horizontal stack) nous pouvons juxtaposer des images.<jupyter_code>a = np.hstack([img, img])
plt.imshow(a);<jupyter_output><empty_output><jupyter_text>SuperposerAvec la commande `vstack` (horizontal stack) nous pouvons superposer des images.<jupyter_code>a = np.vstack([img, img])
plt.imshow(a);<jupyter_output><empty_output><jupyter_text>MandelbrotPour terminer, calculons un fractal de Mandelbrot.<jupyter_code>def mandelbrot(h, w, maxit=20):
    """Returns an image of the Mandelbrot fractal of size (h,w)."""
    y, x = np.ogrid[-1.4:1.4:h*1j, -2:0.8:w*1j]
    c = x + y*1j
    z = c
    divtime = maxit + np.zeros(z.shape, dtype=int)

    for i in range(maxit):
        z = z**2 + c
        diverge = z*np.conj(z) > 2**2         # who is diverging
        div_now = diverge & (divtime==maxit)  # who is diverging now
        divtime[div_now] = i                  # note when
        z[diverge] = 2                        # avoid diverging too much

    return divtime

plt.imshow(mandelbrot(400, 400));<jupyter_output><empty_output>