5 - Contour sur une image
La dernière fois, vous avez pris Thonny en main, vous avez appris à installer un module, à créer un programme avec Python et à modifier des images à l'aide d'un programme Python.
Aujourd'hui : révisions des notions vues la fois dernière et application avec la réalisation d'une nouvelle fonction.
1 - Python-Variable-Fonction
Pour manipuler les images avec Python, il faut possèder un module spécifique, qui gère les images : Pillow.
Commençons par voir si vous avez le module.
01° Tapez ceci dans la console pour voir si cela déclenche une erreur.
>>> from PIL import Image
Si c'est le cas :
- Ouvrir le menu Tool/Outils en haut vers la droite dans Thonny
- Sélectionner Manage Packages/Gérer les Paquets
- Faire une recherche sur Pillow puis installer la bibliothèque. Ca peut être un peu long.

02° Téléchargez une image de type png ou jpg sur le Web et placez la dans un dossier nommé SNT-photographie. Choisissez une image possèdant pas mal de couleurs différentes si possible.
03° Enregistrer le programme ci-dessous (après avoir lu la remarque ATTENTION) avec Thonny en le plaçant dans le même répertoire SNT-photographie que votre image. ATTENTION : il faudra modifier le nom du fichier stocké dans la variable base de façon à ce qu'il corresponde à celui de votre fichier-image.
📁 SNT-photographie
📄 contour.py
📄 votre_image.png
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78 |
|
04° Lancer votre programme. Si une erreur apparaît (en rouge), lire le message.
Souvent :
- soit vous n'avez pas installé le module Pillow !
- soit vous n'avez pas modifié le nom associé à la variable base
- soit vous n'avez pas mis votre image et votre fichier Python dans le même répertoire
Si vous bloquez, faire appel à l'enseignant.
Vous devriez avoir une image à l'écran, mais une image où les intensités bleu et le rouge ont été inversées : voir les lignes suivantes
66
67
68 | rouge = b # On place la valeur b dans rouge
vert = g # On laisse la valeur g dans vert
bleu = r # On place la valeur r dans bleu
|
Exemple avec une image contenant beaucoup de rouge et d'orange :

Et qui devient une image contenant beaucoup de bleu et de cyan :

05° Comment se nomment rouge, vert et bleu ?
- Fonction
- Variable
- Module
- Valeur
66
67
68 | rouge = b # On place la valeur b dans rouge
vert = g # On laisse la valeur g dans vert
bleu = r # On place la valeur r dans bleu
|
...CORRECTION...
Ce sont des variables.
06° Si on écrit ceci :
66
67
68 | rouge = b # On place la valeur b dans rouge
vert = g # On laisse la valeur g dans vert
bleu = r # On place la valeur r dans bleu
|
Est-ce
- rouge qu'on remplit avec r ou
- r qu'on remplit avec rouge
...CORRECTION...
C'est rouge qu'on remplit avec r.
Python évalue le membre de droite et va ensuite créer la variable à gauche et la remplir avec ce qu'il a évalué à droite.
C'est pour cela qu'on trouve souvent une fléche orientée plutôt qu'un égal dans les algorithmes :
rouge ← r.
07° Comment se nomme filtrage :
- Fonction
- Variable
- Module
- Valeur
64
65
66
67
68
69 | def filtrage(r, g, b):
"""Fonction qui renvoie des valeurs r, g, b après les avoir modifiées"""
rouge = b # On place la valeur b dans rouge
vert = g # On laisse la valeur g dans vert
bleu = r # On place la valeur r dans bleu
return (rouge, vert, bleu)
|
...CORRECTION...
C'est une fonction.
08° Que vont contenir les variables-paramètres r, g et b si on lance un appel à la fonction de cette façon :
>>> filtrage(200, 100, 50)
64
65
66
67
68
69 | def filtrage(r, g, b):
"""Fonction qui renvoie des valeurs r, g, b après les avoir modifiées"""
rouge = b # On place la valeur b dans rouge
vert = g # On laisse la valeur g dans vert
bleu = r # On place la valeur r dans bleu
return (rouge, vert, bleu)
|
...CORRECTION...
C'est comme si on avait tapé ceci dans la fonction :
r = 200
g = 100
b = 50
09° Comment indique-t-on à Python que les lignes 65 à 69 font partie de la fonction ?
64
65
66
67
68
69 | def filtrage(r, g, b):
"""Fonction qui renvoie des valeurs r, g, b après les avoir modifiées"""
rouge = b # On place la valeur b dans rouge
vert = g # On laisse la valeur g dans vert
bleu = r # On place la valeur r dans bleu
return (rouge, vert, bleu)
|
...CORRECTION...
On décale les instructions vers la droite.
Cela consiste à placer 4 espaces.
10° Quel est le mot-clé permettant de demander à la fonction de répondre ?
64
65
66
67
68
69 | def filtrage(r, g, b):
"""Fonction qui renvoie des valeurs r, g, b après les avoir modifiées"""
rouge = b # On place la valeur b dans rouge
vert = g # On laisse la valeur g dans vert
bleu = r # On place la valeur r dans bleu
return (rouge, vert, bleu)
|
...CORRECTION...
Ligne 69 : return.
La fonction répond en fournissant le résultat derrière le return.
2 - Intensité des couleurs
Et que contiennent les valeurs d'intensité d'un pixel ?
Une valeur entière comprise entre 0 et 255.
11° Pourquoi l'octet 0000 0000
vaut-il 0 ? Quel calcul doit-on faire ?
Nombre M = | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
Les bits codent | 128 | 64 | 32 | 16 | 8 | 4 | 2 | 1 |
On obtient donc |
...CORRECTION...
Nombre M = | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
Les bits codent | 128 | 64 | 32 | 16 | 8 | 4 | 2 | 1 |
On obtient donc | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
On fait l'addition mais comme il n'y a que des 0, on obtient... 0.
12° Pourquoi l'octet 1111 1111
vaut-il 255 ? Quel calcul doit-on faire ?
Nombre M = | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 |
Les bits codent | 128 | 64 | 32 | 16 | 8 | 4 | 2 | 1 |
On obtient donc |
...CORRECTION...
Nombre M = | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 |
Les bits codent | 128 | 64 | 32 | 16 | 8 | 4 | 2 | 1 |
On obtient donc | 128 | 64 | 32 | 16 | 8 | 4 | 2 | 1 |
On fait l'addition 128+64+32+16+8+4+2+1. Ca donne 255.
Nous venons donc de voir que pour une intensité lumineuse codée sur 1 octet, les valeurs possibles vont de 0 à 255.
On rappellera d'ailleurs qu'en hexadécimal, 255 se note FF.
C'est pour cela que le code RGB HTML du rouge est #FF000000
.
13° Lancer quelques commandes dans la console (le Shell dans la version anglaise) pour voir les valeurs des intensités R, G et B de quelques pixels au hasard sur l'image de base (variable base ou l'image modifiée (variable sauvegarde). Exemple ici sur l'image de base sur le pixel en x=50 et y = 100 par exemple.
>>> pixel(base, 50, 100)
'Pixel de coordonnées (50, 100) : R = 160 - G = 174 - B = 3'
>>> pixel(sauvegarde, 50, 100)
'Pixel de coordonnées (50, 100) : R = 3 - G = 174 - B = 160'
Vérifier que les intensités sont toutes entre 0 et 255.
3 - Image en noir et blanc
Tentons de réaliser un effet Manga Noir et Blanc à partir de notre image.
Si on veut uniquement du noir (RBG = (0,0,0)
) ou du blanc (RGB = (255,255,255)
) en fonction de la luminosité globale, il faut utiliser une nouvelle notion : l'instruction conditionnelle.
Principe :
- on calcule l'intensité "grise" du pixel (version oeil humain)
- on décide d'un seuil :
- Si l'intensité est supérieure au seuil, on place un pixel blanc.
- Si l'intensité est inférieure ou égale au seuil, on place du noir.
1
2
3
4
5
6
7
8 | def filtrage(r, g, b):
"""Fonction qui renvoie des valeurs r,g,b après les avoir modifiées"""
gris = (21*r + 71*g + 8*b) // 100
seuil = 100
if gris > seuil:
return (255, 255, 255)
else:
return (0,0,0)
|
14° Tester cette fonction avec différentes avec différents seuils : il suffit de modifier la valeur de la variable seuil.
Exemple avec un seuil de 80 :

Exemple avec un seuil de 120 :

15° Comment indique-t-on en Python qu'une instruction fait partie du SI (if en Python) ou du SINON (else en Python) ?
1
2
3
4
5
6
7
8 | def filtrage(r, g, b):
"""Fonction qui renvoie des valeurs r,g,b après les avoir modifiées"""
gris = (21*r + 71*g + 8*b) // 100
seuil = 100
if gris > seuil:
return (255, 255, 255)
else:
return (0,0,0)
|
...CORRECTION...
Comme pour les fonctions, il faut décaler les instructions sur la droite, à l'aide de 4 espaces.
Du coup, le if est décalé de 4 espaces pour indiquer qu'il appartient à la fonction et l'instruction suivante est décalée de 4 espaces également pour montrer qu'elle appartient ... au if qui est dans la fonction.
4 - Détection de contour
Pour détecter un contour, nous avons besoin d'une image noir et blanc. C'est l'objet de la question précédente.
Pour détecter un contour, l'une des techniques consiste à étudier les 8 pixels (noir ou blanc) qui entourent le pixel central C.
C | ||
On obtient ainsi une zone de 9 pixels.
Principe de la détection :
- SI, dans ce carré de 9 pixels, entre 3 à 6 pixels ont la même couleur :
- on considère qu'on est proche d'un contour : on dessine les 9 pixels en noir.
- SINON
- on dessine les 9 pixels en blanc : on est loin d'un contour.
- Si on a 7 pixels blancs, c'est qu'il s'agit juste d'une zone très clair
- Si on a 7 pixels noir, c'est qu'il s'agit juste d'une zone très sombre.
16° Ces 9 pixels caractérisent-ils une zone proche d'une bordure ? Font-ils les modifier pour les rendre tous blanc ou noir ?
C | ||
...CORRECTION...
On a bien 3 blancs (ou 6 noirs) : la zone n'est ni assez blanche, ni assez noire. Il s'agit donc d'un contour.
Il faudra pendre les 9 pixels en noir.
17° Ces 9 pixels caractérisent-ils une zone proche d'une bordure ? Font-ils les modifier pour les rendre tous blanc ou noir ?
C | ||
...CORRECTION...
2 pixels blancs (et donc 7 pixels noirs).
On va donc considérer qu'il ne s'agit pas d'un coutour : on mettra du blanc partout.
18° Tester ce programme avec une image sur laquelle des formes sont assez clairement détectables. N'oubliez pas de modifier le nom de base. Conclusion ?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164 |
|
Exemple d'utilisation :


Bien entendu, pour qu'un programme détecte que c'est un chapeau, il faut sortir d'autres programmes : les IA par exemple.
5 - FAQ
Pas de question pour le moment
Activité publiée le 06 01 2021
Dernière modification : 06 01 2021
Auteur : ows. h.