Lancer la version interactive sur : binderlink colablink


Histoire de bugs

Objectif et durée

L’objectif de cette séquence est de corriger des erreurs ou mauvaises pratqiue communément vues en classe. Il est possible de réaliser cette séquence en une période.

Introduction

Je vous présente Bob, un jeune élève qui apprend l’informatique. Il manquait probablement un peu de sommeil car il a réussi à écrire une série un notebook truffé de bugs. Vous allez aider Bob à distance en corrigeant son code et en lui expliquant quel était son problème en dessous de la cellule bogguée. Attention, c’était une dure journée pour Bob et il pourra y avoir plusieurs bugs par cellule. Nous partirons de la cellule de code suivante qui n’est pas bogguée.

[2]:
import numpy as np # Pour manipuler des tableaux de nombres
import matplotlib.pyplot as plt # pour afficher des images

def creer_image(hauteur,largeur):
    return np.zeros((hauteur,largeur))

## Création d’image

Bob veut créer une image et la modifier pour que le premier pixel soit blanc, voici ce qu’il a écrit:

[2]:
creer_image(8,12)
img[0,0] = 255
---------------------------------------------------------------------------
NameError                                 Traceback (most recent call last)
<ipython-input-2-e346498b1b2b> in <module>
      1 creer_image(8,12)
----> 2 img[0,0] = 255

NameError: name 'img' is not defined

## Définition de fonctions utiles Il souhaite maintenant définir deux fonctions. Une qui affiche la taille d’une image donnée en argument, et l’autre qui affiche l’image donnée en argument, avec ce code:

[3]:
def printSize(image):
    print("Largeur x hauteur = "image.shape[1]" x "image.shape[0])

def montrer_image(image):
    plt.imshow(img, cmap='gray',vmin = 0, vmax = 255)
return plt.show()
  File "<ipython-input-3-f63f1ae0c3d0>", line 2
    print("Largeur x hauteur = "image.shape[1]" x "image.shape[0])
                                ^
SyntaxError: invalid syntax

Modification d’une ligne de l’image

Bob veut maintenant que la première ligne d’une image de 10x10 pixels soit blanche et le reste noir. Il écrit un code qui ne fait pas d’erreur mais qui ne fait pas ce qu’il veut. Voici son code:

[8]:
img = np.zeros((10, 10))
img[0,0:-1] = 255

Compter les pixels blancs

Bob écrit une fonction qui permet de compter les pixels ayant une valeur de 255 dans une image. Il écrit cette fonction qui marche mais son enseignant lui dit que ça n’est pas bon…

[10]:
def comptePixel255(image):
    var1 = 0
    for y in range(image.shape[0]):
        for x in range(image.shape[1]):
            niveau_gris = image[y,x]
            if niveau_gris == 255:
                var1 += 1
    return var1

print(comptePixel255(img))
9

Retournement horizontal

Enfin Bob veut écrire une fonction qui fait un retournement horizontal d’une image donnée en argument de la fonction. Encore une fois, Bob ne voit pas de bug mais son enseignant n’est tout de même pas satisfait. Bob n’oublie pas que c’est pour son bien que son enseignant pinaille parfois :)

[7]:
def flip(img):
    img_flip = np.zeros((10,10))
    for y in range(10):
        for x in range(10):
            img_flip[y,x] = img[y,-x-1]
    return img_flip

# création de l'image à retourner
img = np.zeros((10, 10))
img[2,2] = 255
img[2,7] = 255
img[6,2] = 255
img[6,6:8] = 255
img[7,3:6] = 255
plt.imshow(img, cmap='gray',vmin = 0, vmax = 255)
plt.show()

# flip
img_flip = flip(img)
../_images/notebooks_HistoireDeBugs_12_0.png
[ ]: