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'instructionpass
pour ne rien faire.
Compléter le code suivant, en ajoutant aussi des tests :
def propager(M, i, j, intensite):
if M[i][j] == ...:
# ...
return
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
if not condition:
actions
Plutôt que
if condition:
pass
else:
actions
Z