SNT Photo Filtrage

Identification

Infoforall

4 - Filtrage d'une image


Nous allons voir comment modifier les pixels des photos pour obtenir différents effets.

Image contenant beaucoup de rouge
Image de base libre de droit : le Palais des congrès de Montréal

Mise en évidence d'une couleur, transformation en noir et blanc, détection de contour ...

Cela vous permettra de voir ce qu'on peut faire avec un langage de programmation comme Python.

1 - Prise en main des images avec Python

RAPPEL

Thonny permet de travailler avec Python dans un environnement qui permet de voir le contenu des variables, et d'avoir accès au même endroit à :

  • la fenêtre de programmation où on tape des instructions qu'on pourra exécuter plusieurs fois. C'est la partie en haut à gauche ci-dessous qui contient les mots largeur et hauteur.
  • la console où on écrit des instructions qui seront exécutées immédiatement. C'est la partie en bas à gauche qui contient 3 chevrons >>>. Ces chevrons forment l'invite de commande : le système précise qu'il est prêt à exécuter ce qu'on va taper.
  • la zone de visualisation des variables à droite. Elle permet de voir ce qui est en mémoire, ou pas.
Thonny

Nous allons maintenant manipuler des images et changer les valeurs RGB des différents pixels.

Nous avons vu dans l'activité précédente qu'une image n'est qu'une succession de nombres.

Pour manipuler les images avec Python et Thonny, il faut possèder un module spécifique, qui gère les images : Pillow.

01-A (action)° Ouvrir Thonny. Dans le menu Affichage ou View, sélectionner variables.

Cela devrait ouvrir une zone à droite qui vous montrera les choses en mémoire.

Commençons par voir si vous disposez (ou pas) du module Pillow.

01-B (action)° Tapez ceci dans la console pour voir si cela déclenche une erreur.

>>> from PIL import Image

Si cela déclenche une erreur, c'est que vous n'avez pas installé la bibliothèque Pillow. Pour l'installer, suivre alors le déroulé suivant :

  • 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.
Vue Manage Packages

01-C (action)° 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.

Par exemple, pour illustrer ce cours, j'ai choisi ceci :

Image contenant beaucoup de rouge
Image de base libre de droit : le Palais des congrès de Montréal

01-D° Réaliser les deux actions ci-dessous qui vont permettre à Python de vous donner certaines informations sur votre image : sa taille et son nombre de couches :

  • 1 couche pour une image en nuance de gris uniquement,
  • 3 couches RGB pour une image en couleur,
  • 4 couches RGBA pour une image en couleur où A est la couche Alpha de transparence.

Tâches à réaliser :

  1. Enregistrer au même endroit que votre image le programme ci-dessous sous le nom gestion.py, donc dans le répertoire SNT-photographie.
  2. 📁 SNT-photographie

    📄 gestion.py

    📄 votre_image.png

  3. dans le programme Python, modifier la ligne 5 pour que la variable ref_image fasse référence aux bons nom et extension de votre fichier-image. RAPPEL : le nom doit être placé entre guillemets pour faire comprendre à Python qu'on lui transmet un string, une chaîne de caractère, un texte.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
from PIL import Image # importation de Image, permettant de gérer... les images AFFICHAGE = True # Booléen True ou False. Si True, l'image apparait en fin de programme. ref_image = Image.open("image.jpeg") # ouverture et stockage dans ref_image de l'image nbr_colonnes = ref_image.width # width veut dire largeur en anglais nbr_lignes = ref_image.height # height veur dire hauteur en anglais couches = ref_image.getbands() # pour récupérer les couches nbr_couches = len(couches) # pour récupérer le nombre de couches (len pour length, longueur) print("Pixels en largeur : ", nbr_colonnes) print("Pixels en hauteur : ", nbr_lignes) print("Pixels au total : ", nbr_colonnes * nbr_lignes) print("Couches : ", couches) print("Nbr de couches : ", nbr_couches) if AFFICHAGE: ref_image.show()

Exemple de résultats pouvant s'afficher dans la console :

Pixels en largeur : 1024 Pixels en hauteur : 771 Pixels au total : 789504 Couches : ('R', 'G', 'B') Nbr de couches : 3

02° Lire le programme en totalité, ligne par ligne, même si vous ne comprennez pas tout pour le moment puis répondre aux question suivantes :

  1. (rappel de cours : affectation) Lors d'une affectation (comme sur les lignes 3, 7, 8, 9 et 10), va-t-on de la gauche vers la droite ou la droite vers la gauche ?
  2. (analyse du code): En ligne 3, dans quelle variable a-t-on stocké les données de l'image ? Comment s'appelle la fonction qui permet à Python de mettre en mémoire votre fichier-image ?
  3. (rappel de cours : instruction conditionnelle) : Pourquoi-a-t-on indenté vers la droite la ligne 19 ? Dans quel cas va-t-on réaliser la ligne 19 au vu de la ligne 18 ?
  4. Lignes 3-18-19 : Sur quelle ligne demande-t-on d'afficher l'image ? Comment se nomme la fonction qui permet d'afficher l'image ? Expliquer pourquoi l'image s'affiche et comment modifier le programme pour désactiver cet affichage avec la constante.

...CORRECTION...

  1. L3 : affectation de la droite vers la gauche. On va donc "remplir" ici la variable ref_image avec l'évaluation qu'on trouve du côté droit.
  2. L3 : la variable se nomme ref_image et la fonction d'ouverture se nomme open().
  3. On indente les instructions à réaliser si la condition évaluée est True (vraie). Ici, on réalise donc la L19 uniquement si la constante AFFICHAGE contient True.
  4. Demande d'affichage L19 avec ref_image.show(). Cette ligne s'exécute car AFFICHAGE contient True. Pour ne plus afficher l'image à chaque lancement, il suffit de modifier la constante en L3 en lui mettant False.

PIXELISATION

Nous allons réaliser en deux actions une pixelisation de votre image :

  1. On commence par réduire la taille de l'image par 10, ce qui entraine une perte d'informations.
  2. On finit en redonnant la taille initiale à l'image réduite. La perte d'informations va alors clairement apparaître.

03° Utiliser ce nouveau programme puis répondre aux questions.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
from PIL import Image AFFICHAGE = True ref_image = Image.open("image.jpeg") nbr_colonnes = ref_image.width # width veut dire largeur en anglais nbr_lignes = ref_image.height # height veur dire hauteur en anglais if AFFICHAGE: ref_image.show() ref_image = ref_image.resize( (nbr_colonnes//10, nbr_lignes//10) ) # On divise la taille par 10 ref_image = ref_image.resize( (nbr_colonnes, nbr_lignes) ) # On remet la taille initiale if AFFICHAGE: ref_image.show() ref_image.save("image_pixelisée.jpg") # On sauvegarde l'image obtenue en modifiant le nom

Questions

  1. Sur quelle ligne divise-t-on la taille de l'image par 10 ? Comment se nomme la méthode permettant de modifier la taille d'une image ?
  2. Sur quelle ligne lui redonne-t-on sa taille initiale ?
  3. Pourquoi voit-on deux affichages ?
  4. Sur quelle ligne demande-t-on à Python de sauvegarder l'image ?

...CORRECTION...

  1. L13 avec la méthode resize().
  2. L15 avec ref_image = ref_image.resize( (nbr_colonnes, nbr_lignes) )
  3. Deux affichages car on lui demande d'afficher l'image avant modification en L11 puis après modification en L17.
  4. L19 avec ref_image.save("image_pixelisée.jpg")

2 - Gestion des pixels avec Python

Nous allons maintenant changer les valeurs RGB des différents pixels.

Nous avons vu dans l'activité précédente qu'une image n'est qu'une succession de nombres.

04-A° Si ce n'est pas encore fait car vous reprennez l'activité, 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.

Par exemple, pour illustrer ce cours, j'ai choisi ceci :

Image contenant beaucoup de rouge
Image de base libre de droit : le Palais des congrès de Montréal

04-B° Réaliser les deux actions ci-dessous. Inutile de lire le code dans sa totalité pour le moment, nous allons l'analyser par petits bouts.

  1. Enregistrer avec Thonny le programme ci-dessous au même endroit que votre image, donc dans le répertoire SNT-photographie.
  2. 📁 SNT-photographie

    📄 votre_programme.py

    📄 votre_image.png

  3. Modifier le nom du fichier-image en ligne 4 stocké dans la variable originel de façon à ce qu'il corresponde à celui de votre image. Attention, le nom doit être placé entre guillemets pour faire comprendre à Python qu'on lui transmet un string.
  4. Lancer pour vérifier qu'on obtient bien les intensités de 3 pixels.
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
from PIL import Image # Nom du fichier-image originel : base = "nom_a_modifier.png" # Nom pour l'image après modification : sauvegarde = "modification.png" def pixel(nom, x, y): """Fonction qui renvoie un string contenant les intensité du pixel (x,y) de l'image""" ref_image = Image.open(nom) # création de l'objet-image couches = ref_image.getbands() # pour récupérer la ou les couches nbr_couches = len(couches) # nombre de couches txt = "Pixel en " + str(x) + " " + str(y) + " : " if nbr_couches == 1: intensite = ref_image.getpixel( (x,y) ) txt = txt + str(intensite) elif nbr_couches == 3: # Si image avec 3 couches : RGB r, g, b = ref_image.getpixel( (x,y) ) txt = txt + str(r) + " " + str(g) + " " + str(b) elif nbr_couches == 4: r, g, b, alpha = ref_image.getpixel( (x,y) ) txt = txt + str(r) + " " + str(g) + " " + str(b) + " " + str(alpha) else: txt = txt + "Problème, nombre de couches étranges..." return txt # Affichage des valeurs de certains pixels print( pixel(base, 0, 0) ) print( pixel(base, 0, 1) ) print( pixel(base, 0, 2) )

05° Etude des transferts entre les appels et la fonction. Observer les appels et la déclaration de la fonction pixel puis répondre aux questions..

  1. Dans quelles variables vont être stockées les valeurs envoyées à la fonction lors de l'appel de la ligne 36 : base, 0, 0
  2. Pourquoi a-t-on trois affichages ?
  3. Sur la ligne 15 de la fonction pixel(), str() pourquoi doit-on transformer les entiers x et y qu'on a reçu en string avec str() ?

...CORRECTION...

  1. Pour répondre, il faut comparer la ligne de la déclaration et la ligne de l'appel :
  2. 9 .. 36
    def pixel(nom, x, y): print( pixel(base, 0, 0) )

    nom reçoit base

    x reçoit 0

    y reçoit 0

    Il faut associer place par place :

  3. Trois affichages car nous avons trois print() correspondant à 3 appels.
  4. 35 36 37 38
    print( pixel(base, 0, 0) ) print( pixel(base, 0, 1) ) print( pixel(base, 0, 2) )
  5. Nous avons vu qu'on ne peut pas concatétener des strings et des entiers : cela provoque une erreur !
  6. >>> "A" + "2" 'A2' >>> "A" + 2 TypeError: can only concatenate str (not "int") to str >>> "A" + str(2) 'A2'

06° Etude de la fonction pixel() :

  1. L14 : que va contenir la variable nbr_couches ?
  2. L17-21-25 : quel est le cas qui correspond à une image en nuances de gris ? En couleur ? En couleur avec gestion de la transparence ?
  3. L22 : comment se nomme la méthode permettant de récupérer les intensités lumineuses du pixel de coordonnées (x, y) ?
  4. L21-L22 : combien y-a-t-il de couches sur ce pixel si on active ce bloc ? Combien a-t-on placé de variables à gauche pour récupérer les valeurs d'intensités du pixel ?
  5. L32 : quel est le type de la réponse envoyée par la fonction ?

...CORRECTION...

  1. L14 : nbr_couches contient le nombre de couches sur chaque pixel de cette image.
  2. L17-21-25 : Une image en nuance de gris n'a qu'une couche donc L17. Une image en couleur RGB possède 3 couches donc ligne 21. Avec la transparence, on atteint 4 couches, donc L25.
  3. L21-L22 : si on atteint la ligne 22, c'est qu'on a 3 couches sur cette image. On a donc placé trois variables du côté gauche pour récupérer les trois valeurs RGB du pixel.
  4. r, g, b = ref_image.getpixel( (x,y) )

  5. La fonction renvoie un string.

07° Nous voudrions tenter d'afficher les valeurs des pixels un par un. Il va donc falloir faire varier x progressivement de 0 jusqu'à la dernière valeur possible en x sur la largeur. Ensuite, il faudra passer à la ligne y suivante.

  1. Remplacer intégralement votre programme par celui-ci : la seule ligne du programme consiste à un appel à la fonction pixels() qui fait varier x et y et, pour chacune des valeurs obtenues, affiche le résultat de la fonction pixel() qui donne les intensités pour le pixel de coordonnées x, y.
  2. Constater qu'on parvient bien à lire les pixels un par un avec notre double boucle (un for imbriqué dans un for) puis couper le programme en appuyant sur STOP.
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
from PIL import Image # Nom du fichier-image originel : base = "photo-montreal-palais-des-congres.jpeg" # Nom pour l'image après modification : sauvegarde = "modification.png" def pixel(nom, x, y): """Fonction qui renvoie un string contenant les intensité du pixel (x,y) de l'image""" ref_image = Image.open(nom) # création de l'objet-image couches = ref_image.getbands() # pour récupérer la ou les couches nbr_couches = len(couches) # nombre de couches txt = "Pixel en " + str(x) + " " + str(y) + " : " if nbr_couches == 1: intensite = ref_image.getpixel( (x,y) ) txt = txt + str(intensite) elif nbr_couches == 3: # Si image avec 3 couches : RGB r, g, b = ref_image.getpixel( (x,y) ) txt = txt + str(r) + " " + str(g) + " " + str(b) elif nbr_couches == 4: r, g, b, alpha = ref_image.getpixel( (x,y) ) txt = txt + str(r) + " " + str(g) + " " + str(b) + " " + str(alpha) else: txt = txt + "Problème, nombre de couches étranges..." return txt def pixels(nom): """Affiche toutes les valeurs des pixels""" ref_image = Image.open(nom) # création de l'objet-image nbr_colonnes = ref_image.width nbr_lignes = ref_image.height for y in range(nbr_lignes): for x in range(nbr_colonnes): print( pixel(nom, x, y) ) pixels(base)

08° 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

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
from PIL import Image base = "photo-montreal-palais-des-congres.jpeg" # Nom du fichier-image original sauvegarde = "modification.png" # Nom voulu pour l'image après modification def filtrer_image(nom): """Fonction qui renvoie un objet-image après l'avoir filtré pixel par pixel""" ref_image = Image.open(nom) # Création de l'objet-image propre à Python nbr_colonnes = ref_image.width # Recherche de la largeur de l'image nbr_lignes = ref_image.height # Recherche de la hauteur de l'image couches = ref_image.getbands() # pour récupérer la ou les couches nbr_couches = len(couches) # nombre de couches if nbr_couches == 3: # Si image avec 3 couches : R G B for y in range(nbr_lignes): for x in range(nbr_colonnes): r, g, b = ref_image.getpixel( (x,y) ) r, g, b = filtrage(r, g, b) ref_image.putpixel( (x, y) , (r, g, b) ) if len(ref_image.getbands()) == 4: # Si image avec 3 couches : R G B A for y in range(nbr_lignes): for x in range(nbr_colonnes): r, g, b, alpha = ref_image.getpixel( (x,y) ) r, g, b = filtrage(r, g, b) ref_image.putpixel( (x,y), (r, g, b, alpha) ) return ref_image def filtrage(ancien_r, ancien_g, ancien_b): """Fonction qui renvoie des valeurs RGB après les avoir modifiées""" r = ancien_b # On place la valeur b dans rouge g = ancien_g # On laisse la valeur g dans vert b = ancien_r # On place la valeur r dans bleu return (r, v, b) nouvelle = filtrer_image(base) nouvelle.show() nouvelle.save(sauvegarde)

Exemple avec une image contenant beaucoup de rouge et d'orange :

Image contenant beaucoup de rouge
Image de base libre de droit : le Palais des congrès de Montréal

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

Image contenant beaucoup de bleu
Même image en intervertissant Bleu et Rouge

09° Expliquer ce que renvoie la fonction filtrage() lorsqu'elle reçoit les trois paramètres ancien_r ancien_g ancien_b.

...CORRECTION...

Si on lit le code, on peut se rendre compte qu'elle renvoit le triplet de valeurs mais en intervertissant le rouge et le bleu.

31 32 33 34 35 36 37 38
def filtrage(ancien_r, ancien_g, ancien_b): """Fonction qui renvoie des valeurs RGB après les avoir modifiées""" r = ancien_b # On place la valeur b dans rouge g = ancien_g # On laisse la valeur g dans vert b = ancien_r # On place la valeur r dans bleu return (r, v, b)

Sur ce pixel, les intensités du bleu et du rouge sont donc inversées.

10° En lisant rapidement les lignes 18-19-20 de la fonction filter_image(), comment se nomme la méthode permettant de récupérer les valeurs d'un pixel ? Comment se nomme la méthode qui permet de modifier les valeurs d'un pixel ?

...CORRECTION...

  • L18 -> On récupère avec getpixel()
  • L20 -> On modifie avec putpixel()

11° En traduisant en français une par une les lignes 9 à 20, expliquer comment la fonction filter_image() parvient à transformer tous les pixels de l'image.

...CORRECTION...

  • L9 -> on stocke l'image dans ref_image
  • L10 -> on récupère le nombre de colonnes
  • L11 -> on récupère le nombre de lignes
  • L12 -> on récupère les couches
  • L13 -> on récupère le nombre de couches
  • L15 -> Si on a bien une image RGB
  • L16 -> Pour chaque ligne y de l'image
  • L17 -> Pour chaque colonne x de l'image
  • L18 -> on récupère les valeurs rgb du pixel en cours
  • L19 -> on modifie les valeurs du pixel
  • L20 -> on replace le nouveau pixel dans l'image

La fonction filtrage()  inverse les valeurs des intensités R et B.

Regardons comment nous pourrions l'utiliser différemment.

3 - Filtrage

Filtrer les couleurs veut dire en laisser passer certaines et pas d'autres.

Pour l'instant, la fonction filtrage() ne provoque qu'une intervertion de couleurs.

12° CREER UN FILTRE ROUGE : cela veut dire que la fonction filtrage ne doit renvoyer que la bonne intensité rouge de départ et mettre les autres à 0.

Image contenant beaucoup de rouge
Image de base libre de droit : le Palais des congrès de Montréal

Et qui devient une image ne contenant que les intensités rouges :

Image avec uniquement la couche Rouge
La couche Rouge

L'une à côté de l'autre :

Image contenant beaucoup de rouge Image avec uniquement la couche Rouge

...CORRECTION...

31 32 33 34 35 36 37 38
def filtrage(ancien_r, ancien_g, ancien_b): """Fonction qui renvoie des valeurs RGB après les avoir modifiées""" r = ancien_r # On laisse le rouge g = 0 # On supprime le vert b = 0 # On supprime le bleu return (r, v, b)

13° CREER UN FILTRE BLEU : cela veut dire que la fonction filtrage() ne doit renvoyer que la bonne intensité bleue de départ et mettre les autres à 0.

Image contenant beaucoup de rouge
Image de base libre de droit : le Palais des congrès de Montréal

Et qui devient une image ne contenant que les intensités bleues :

Image avec uniquement la couche Bleue
La couche Bleue

L'une à côté de l'autre :

Image contenant beaucoup de rouge Image avec uniquement la couche Bleue

...CORRECTION...

31 32 33 34 35 36 37 38
def filtrage(ancien_r, ancien_g, ancien_b): """Fonction qui renvoie des valeurs RGB après les avoir modifiées""" r = 0 # On supprime le rouge g = 0 # On supprime le vert b = ancien_b # On laisse le bleu return (r, v, b)

14° CREER UN FILTRE VERT : cela veut dire que la fonction filtrage() ne doit renvoyer que la bonne intensité verte de départ et mettre les autres à 0.

Image contenant beaucoup de rouge
Image de base libre de droit : le Palais des congrès de Montréal

Et qui devient une image ne contenant que les intensités vertes :

Image avec uniquement la couche Verte
La couche Verte

L'une à côté de l'autre :

Image contenant beaucoup de rouge Image avec uniquement la couche Verte

...CORRECTION...

31 32 33 34 35 36 37 38
def filtrage(ancien_r, ancien_g, ancien_b): """Fonction qui renvoie des valeurs RGB après les avoir modifiées""" r = 0 # On supprime le rouge g = ancien_g # On laisse le vert b = 0 # On supprime le bleu return (r, v, b)

15° IMAGE GRISE : Remplacer les trois intensités R, G et B par la moyenne des trois. On pourra utiliser la division euclidienne en Python en utilisant // plutôt que simplement /.

Par exemple rouge = (r+g+b) // 3

Si les trois intensités RGB ont la même valeur, votre oeil percevra du gris.

Image contenant beaucoup de rouge
Image de base libre de droit : le Palais des congrès de Montréal

Et qui devient une image grise :

Image grise
Image grise

L'une à côté de l'autre :

Image contenant beaucoup de rouge Image grise

...CORRECTION...

31 32 33 34 35 36 37 38
def filtrage(ancien_r, ancien_g, ancien_b): """Fonction qui renvoie des valeurs RGB après les avoir modifiées""" r = (ancien_r + ancien_g + ancien_b) // 3 g = (ancien_r + ancien_g + ancien_b) // 3 b = (ancien_r + ancien_g + ancien_b) // 3 return (r, v, b)

Si on veut transformer une image en couleur en réelle perception grisée pour un oeil humain, il faut utiliser des formules particulières pour avoir un rendu correct car nos yeux ne sont pas sensibles de la même manière à la lumière rouge, verte ou bleue. ils sont beaucoup plus sensibles à la lumière verte qu'aux lumières bleues et rouges.

16° IMAGE GRISE HUMAINE : Remplacer les trois intensités R, G et B par :

red = (21*r + 71*g + 8*b) // 100

Image grise
Nouvelle version

La nouvelle version grise à gauche, la moyenne pure à droite :

Image grise version 2 Image grise

...CORRECTION...

31 32 33 34 35 36 37 38
def filtrage(ancien_r, ancien_g, ancien_b): """Fonction qui renvoie des valeurs RGB après les avoir modifiées""" r = (21*ancien_r + 71*ancien_g + 8*ancien_b) // 100 g = (21*ancien_r + 71*ancien_g + 8*ancien_b) // 100 b = (21*ancien_r + 71*ancien_g + 8*ancien_b) // 100 return (r, v, b)

17 (en équipe)° Tâche finale complexe :

  1. choisir une image sur le Web et à l'aide d'un logiciel de dessin, placer un fond totalement VERT (0, 255,0) sur le fond de votre image.
  2. Sauvegarder cette image en .png (c'est important).
  3. Sélectionner sur le web une autre image d'un paysage quelconque.
  4. Créer maintenant un programme qui :
    1. Place chacune de vos deux images dans une variable différente.
    2. Redimensionne les images pour qu'elles aient les mêmes dimensions.
    3. Pour chaque ligne y et chaque colonne x, si le fond de l'image 1 est vert, alors on la modifie en y placant la valeur du pixel de l'image 2.
    4. On sauvegarde la nouvelle image.

4 - FAQ

Pas de question pour le moment

Comme vous pouvez le voir, il est assez facile de modifier les couleurs d'une image.

Dans d'autres activités, nous verrons qu'on peut en tirer d'autres informations et même qu'il est parfois possible d'y laisser votre nom ou vos coordonnées GPS. C'est dire ...

Prochaine activité : nous allons voir comment trouver les contours d'une image.

Comme une image n'est qu'une suite de nombres, une IA peut assez facilement les générer, les modifier.

Activité publiée le 02 12 2019
Dernière modification : 08 12 2019
Auteur : ows. h.