Aller au contenu

TODO ⚠ Images à refaire !!!

Propagation d'intensité sur une image⚓︎

Soit une image binaire représentée dans un tableau à 2 dimensions. Les éléments M[i][j], appelés pixels, sont des nombres entiers. Une composante d'une image est un sous-ensemble de l'image constitué uniquement d'entiers identiques qui sont côte à côte, soit horizontalement, soit verticalement.

Par exemple, les composantes de

sont

On souhaite, à partir d'un pixel dans une image, donner la valeur intensite à tous les pixels de la composante à laquelle appartient ce pixel.

La fonction propager prend pour paramètre une image pixels, deux entiers i et j et une valeur entière intensite. Elle met à la valeur intensite tous les pixels de la composante de M[i][j].

Par exemple, propager(M, i=2, j=1, intensite=3) donne

Remarque : si M[i][j] est déjà égal à intensite, il n'y a rien à faire. Avec Python, on peut utiliser l'instruction pass pour ne rien faire.

Compléter le code suivant, en ajoutant aussi des tests :

🐍 Script Python
def propager(M, i, j, intensite):
    if M[i][j] == ...:
        # ...
        return
# testsbksl-nlbksl-nlM = [bksl-nl [0, 0, 1, 0],bksl-nl [0, 1, 0, 1],bksl-nl [1, 1, 1, 0],bksl-nl [0, 1, 1, 0],bksl-nl]bksl-nlbksl-nlpropager(M, i=2, j=1, intensite=3)bksl-nlbksl-nlMpy-undattendu = [bksl-nl [0, 0, 1, 0],bksl-nl [0, 3, 0, 1],bksl-nl [3, 3, 3, 0],bksl-nl [0, 3, 3, 0],bksl-nl]bksl-nlbksl-nlassert M == Mpy-undattendubksl-nlbksl-nlbksl-nl# autres testsbksl-nlbksl-nlM = [bksl-nl [0, 0, 1, 0],bksl-nl [0, 1, 0, 1],bksl-nl [1, 1, 1, 0],bksl-nl [0, 1, 1, 0],bksl-nl]bksl-nlbksl-nlpropager(M, i=0, j=0, intensite=5)bksl-nlbksl-nlMpy-undattendu = [bksl-nl [5, 5, 1, 0],bksl-nl [5, 1, 0, 1],bksl-nl [1, 1, 1, 0],bksl-nl [0, 1, 1, 0],bksl-nl]bksl-nlbksl-nlassert M == Mpy-undattendubksl-nlbksl-nl ∞/∞

def propager(M, i, j, intensite):bksl-nl if M[i][j] == ...:bksl-nl # ...bksl-nl returnbksl-nlbksl-nl intensitepy-undorigine = ...bksl-nlbksl-nl M[i][j] = intensitebksl-nlbksl-nl if (i - 1) >= 0 and M[i - 1][j] == ...:bksl-nl # l'élément au-dessus fait partie de la composantebksl-nl propager(M, i - 1, j, intensite)bksl-nlbksl-nl if (...) < len(M) and M[i + 1][j] == 1:bksl-nl # l'élément au-dessous fait partie de la composantebksl-nl propager(M, ..., j, intensite)bksl-nlbksl-nl if (...) >= 0 and M[i][j - 1] == 1:bksl-nl # l'élément à gauche fait partie de la composantebksl-nl ...bksl-nlbksl-nl if ...:bksl-nl # ...bksl-nl ...bksl-nlbksl-nlbksl-nlbksl-nlbksl-nlbksl-nl# testsbksl-nlbksl-nlM = [bksl-nl [0, 0, 1, 0],bksl-nl [0, 1, 0, 1],bksl-nl [1, 1, 1, 0],bksl-nl [0, 1, 1, 0],bksl-nl]bksl-nlbksl-nlpropager(M, i=2, j=1, intensite=3)bksl-nlbksl-nlMpy-undattendu = [bksl-nl [0, 0, 1, 0],bksl-nl [0, 3, 0, 1],bksl-nl [3, 3, 3, 0],bksl-nl [0, 3, 3, 0],bksl-nl]bksl-nlbksl-nlassert M == Mpy-undattendubksl-nlbksl-nldef propager(M, i, j, intensite):bksl-nl if M[i][j] == intensite:bksl-nl # il n'y a rien à fairebksl-nl returnbksl-nlbksl-nl intensitepy-undorigine = M[i][j]bksl-nlbksl-nl M[i][j] = intensitebksl-nlbksl-nl if (i - 1) >= 0 and M[i - 1][j] == intensitepy-undorigine:bksl-nl # l'élément au-dessus fait partie de la composantebksl-nl propager(M, i-1, j, intensite)bksl-nlbksl-nl if (i + 1) < len(M) and M[i + 1][j] == intensitepy-undorigine:bksl-nl # l'élément au-dessous fait partie de la composantebksl-nl propager(M, i + 1, j, intensite)bksl-nlbksl-nl if (j - 1) >= 0 and M[i][j - 1] == intensitepy-undorigine:bksl-nl # l'élément à gauche fait partie de la composantebksl-nl propager(M, i, j - 1, intensite)bksl-nlbksl-nl if (j + 1) < len(M) and M[i][j + 1] == intensitepy-undorigine:bksl-nl # l'élément à droite fait partie de la composantebksl-nl propager(M, i, j + 1, intensite)bksl-nlbksl-nlbksl-nlbksl-nlbksl-nl# testsbksl-nlbksl-nlM = [bksl-nl [0, 0, 1, 0],bksl-nl [0, 1, 0, 1],bksl-nl [1, 1, 1, 0],bksl-nl [0, 1, 1, 0],bksl-nl]bksl-nlbksl-nlpropager(M, i=2, j=1, intensite=3)bksl-nlbksl-nlMpy-undattendu = [bksl-nl [0, 0, 1, 0],bksl-nl [0, 3, 0, 1],bksl-nl [3, 3, 3, 0],bksl-nl [0, 3, 3, 0],bksl-nl]bksl-nlbksl-nlassert M == Mpy-undattendubksl-nlbksl-nl

A

Commentaires⚓︎

{{ IDE('exo_corr') }}

Pour ne rien faire, nous aurions pu insérer pass ou un commentaire comme ici.

Nous aurions pu aussi prendre la négation de la condition, et ne pas placer de clause else.

Il est plus lisible de traiter les cas faciles explicitement dès le début, plutôt que de retarder un dernier cas simple pour la fin. C'est uniquement un choix esthétique et pédagogique.

En revanche, pour un bloc d'actions court, on préfère

🐍 Script Python
if not condition:
    actions

Plutôt que

🐍 Script Python
if condition:
    pass
else:
    actions

Z

Retour en haut de la page