Les images numériques

(actualisé le ) par wlaidet

Présentations

Activité 1
TP1 : Images PBM et PGM
Activité 2 : Couleurs
Diaporama du cours
Cours papier
Activité 3
Traitements des images
Doubles Boucles
Boucles imbriquées et rectangles
TP3_Boucles_imbriquees
Dessiner en boucles

TP 1 : Images PBM et PGM

1) Ouvrir NotePad
2) Copier/coller les données suivantes :

P1
# Image numero 1 SNT
10 10
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1

3) Enregistrer sous Image1.PBM
4) Aller dans l’explorateur de fichiers puis observer le résultat avec LibreOffice Draw ou GIMP
5) Créer votre Image PBM aux dimensions de votre choix (Commencer par créer votre image sur une feuille quadrillée).

6) Dans un nouveau fichier NotePad, copier/coller le code suivant :

P2
# Image numero 2 SNT
10 10
255
255 255 255 255 255 255 255 255 255 255
255 255 255 255 255 255 255 255 255 255
0 0 0 0 0 0 0 0 0 0
255 255 255 255 255 255 255 255 255 255
255 255 255 255 255 255 255 255 255 255
255 255 255 255 255 255 255 255 255 255
128 128 128 128 128 128 128 128 128 128
255 255 255 255 255 255 255 255 255 255
255 255 255 255 255 255 255 255 255 255
255 255 255 255 32 32 255 255 255 255
 

Attention !! Il faut une ligne vide à la fin du fichier

7) Enregistrer sous Image2.PGM
8) Aller dans l’explorateur de fichiers puis observer le résultat avec LibreOffice Draw
9) Modifier ces données pour comprendre ce format.
10) Reproduire l’image suivante :

Image à reproduire

11) Pour les plus rapides : Créer l’image PGM de votre choix.

Mario en couleurs

1) Dans un nouvel onglet, aller à l’adresse suivante : https://trinket.io/python3
2) Copier/coller le code ci-dessous :

import matplotlib.pyplot as plt
from PIL import Image

#Creation d'une image blanche RGB 8x8
Mario = Image.new("RGB",(8,8),(255,255,255))

# definition d'une couleur
rouge = (255, 0, 0)

#remplissage de l'image pixel par pixel
Mario.putpixel((0, 2), rouge)
Mario.putpixel((7, 7), (0, 255, 0))


plt.imshow(Mario)
plt.show()

Télécharger

3) Exécuter ce code et zoomer
4) Modifier ce code pour obtenir l’image suivante :

Mario Couleurs 8x8

TP Simples boucles

1) Ouvrir Pyzon
2) Copier/coller le code ci-dessous

for i in range(0, 32):
    print(0, i)

Télécharger

3) Tester ce code puis le modifier pour obtenir les résultats suivants :

Simples Boucles

4) Tester le code ci-dessous :

import matplotlib.pyplot as plt
from PIL import Image

#Creation d'une image blanche RGB 32x32
Figure1 = Image.new("RGB",(32,32),(255,255,255))

# definition d'une couleur
rouge = (255, 0, 0)

#remplissage de l'image avec une boucle:
for i in range(0,32):
    Figure1.putpixel((0, i), rouge)

#Affichage de l'image
plt.imshow(Figure1)
plt.show()

Télécharger

5) Créer les images suivantes en 32 par 32 :

Simples Boucles images

6) Pour les plus rapides, reproduire le drapeau de la France en 12 par 9.

Dessiner des rectangles

Vous pouvez tester vos avec Pyzo ou en ligne chez vous : https://trinket.io/python3

1) Le code pour démarrer :

import matplotlib.pyplot as plt
from PIL import Image

#Creation d'une image blanche RGB 30x20
Figure1 = Image.new("RGB",(30,20),(255,255,255))

# definition des couleurs:
bleu = (0, 0, 255)
jaune = (255, 255, 0)

#remplissage de l'image avec une double boucle:
for x in range(0,10):
    for y in range(0,20):
        Figure1.putpixel((x, y), bleu)

#remplissage de l'image avec une double boucle:
for x in range(10,30):
    for y in range(12,20):
        Figure1.putpixel((x, y), jaune)

#Affichage de l'image
plt.imshow(Figure1)
plt.show()

Télécharger

2) Dessiner le drapeau Français :

Dessiner le drapeau de la France :

Drapeau France
180 par 120 pixels

3) Dessiner d’autres drapeaux :

Drapeau Italie
180 par 120 pixels
Drapeau Allemagne
180 par 120 pixels
Suisse
180 par 120 pixels
Norvège
180 par 120 pixels

TP3 Dessiner en boucles

Vous pouvez tester vos avec Pyzo ou en ligne chez vous : https://trinket.io/python3

1) Le code pour démarrer :

import matplotlib.pyplot as plt
from PIL import Image

#Creation d'une image blanche RGB 10x10
dessin = Image.new("RGB",(10,10),(255,255,255))

#Definitions des couleurs
rouge = (255, 0, 0)

#On parcourt tous les pixels de l'image
for col in range(0, 10):
    for ligne in range(0, 10):
        if ligne < 4:
            dessin.putpixel((col, ligne), rouge)

plt.imshow(dessin)
plt.show()

Télécharger

2) Modifier le code ci-dessus pour réaliser les drapeaux de la France, de l’Italie puis de l’Allemagne.

Drapeau France
180 par 120 pixels
Drapeau Italie
180 par 120 pixels
Drapeau Allemagne
180 par 120 pixels

3) Combiner des conditions :

import matplotlib.pyplot as plt
from PIL import Image

#Creation d'une image blanche RGB 10x10
dessin3 = Image.new("RGB",(70,40),(255,255,255))

#Definitions des couleurs
monbleu = (0, 51, 153)

#On parcourt tous les pixels de l'image:
for col in range(0, 70):
    for ligne in range(0, 40):
        if ligne > 14 and ligne < 25:
            dessin3.putpixel((col, ligne), monbleu)
        if col > 18 and col < 30:
            dessin3.putpixel((col, ligne), monbleu)

plt.imshow(dessin3)
plt.show()

Télécharger

Le résultat :

Finlande
Combiner des conditions

4) Dessiner les drapeaux de l’Allemagne, de la Suisse et de la Norvège :

Drapeau Allemagne
180 par 120 pixels
Suisse
180 par 120 pixels
Norvège
180 par 120 pixels

Cercles et fonctions affines

Un cercle :

Vous pouvez tester vos avec Pyzo ou en ligne chez vous : https://trinket.io/python3

import matplotlib.pyplot as plt
from PIL import Image

#Creation d'une image blanche RGB 10x10
dessin4 = Image.new("RGB",(180,120),(255,255,255))

#Definitions des couleurs
rouge = (255, 0, 0)

#On parcourt tous les pixels de l'image:
for col in range(0, 180):
    for ligne in range(0, 120):
        if (col-90)**2 + (ligne-60)**2 < 400:
                dessin4.putpixel((col, ligne), rouge)

plt.imshow(dessin4)
plt.show()

Télécharger

Cercle 180 par 120

Dessiner avec des fonctions affines :

Vous pouvez tester vos avec Pyzo ou en ligne chez vous : https://trinket.io/python3

import matplotlib.pyplot as plt
from PIL import Image

#Creation d'une image blanche RGB 10x10
dessin5 = Image.new("RGB",(600,400),(204,204,204))

#Definitions des couleurs
blanc = (255, 255, 255)

#On parcourt tous les pixels de l'image:
for col in range(0, 600):
    for ligne in range(0, 400):
        if ligne >= (2/3)*col - 50 and ligne <= (2/3)*col + 50:
            dessin5.putpixel((col, ligne), blanc)

plt.imshow(dessin5)
plt.show()

Télécharger

Diagonale 600 par 400

Dessiner un polygone

Vous pouvez tester vos avec Pyzo ou en ligne chez vous : https://trinket.io/python3

import matplotlib.pyplot as plt
from PIL import Image

#Creation d'une image blanche RGB 10x10
dessin5 = Image.new("RGB",(600,400),(0,0,204))

#Definitions des couleurs
blanc = (255, 255, 255)
rouge = (255, 0, 0)
jaune = (255, 255, 0)

#On parcourt tous les pixels de l'image:
for col in range(0, 600):
    for ligne in range(0, 400):
        #un quadrilatère (4 conditions):
        if ligne >= (2/3)*col - 50 and ligne <= (2/3)*col + 50 and ligne >= (-2/3)*col + 350 and ligne <= 300:
            dessin5.putpixel((col, ligne), blanc)
        #Un triangle (3 conditions):
        if ligne >= (-2/3)*col + 500 and ligne >= (2/3)*col + 100 and ligne <= 350:
            dessin5.putpixel((col, ligne), rouge)
        #Un triangle (2 conditions):
        if ligne >= (50/200)*col + 50 and ligne <= (-50/200)*col + 150:
            dessin5.putpixel((col, ligne), jaune)

plt.imshow(dessin5)
plt.show()

Télécharger

Polygones
Polygones 180 par 120

Remarque : Le plus rapide est de calculer le coefficient directeur et l’ordonnée à l’origine des droites frontières du polygone.

Par exemple pour le triangle jaune :

Le côté supérieur (du haut) est sur une droite passant par les points de coordonnées (0 ;50) et (200 ;100) donc :

$m = \dfrac{100-50}{200-0} = \dfrac{50}{200}$

L’ordonnée à l’origine est simplement ici $p = 50$ (l’image de 0...)

Dessiner une étoile

Vous pouvez tester vos avec Pyzo ou en ligne chez vous. Deux possibilités : https://trinket.io/python3

import matplotlib.pyplot as plt
from PIL import Image

image=Image.new("RGB",(180,120),(0,0,128))

#On appelle la procédure pour créer une étoile (hors de la boucle principale):
plt.scatter(60, 60, s = 1000, c = 'white', marker = '*')

plt.scatter(130, 60, s = 7000, c = 'red', marker = '*')

plt.imshow(image)
plt.show()

Télécharger

etoiles_plt
Etoiles simples
import matplotlib.pyplot as plt
from PIL import Image

image=Image.new("RGB",(180,120),(0,0,128))

rouge=(200,0,0)
blanc=(255,255,255)

#Placer cette procédure après les couleurs
#xmin::abscisse la plus à gauche
#xmax::abscisse la plus à droite
#ymin::ordonnée (haut) de l'étoile
def etoile(xmin,xmax,ymin,n):
  ymax=ymin+(xmax-xmin)
  ymin2=int(ymin+(ymax-ymin)*0.375)
  ymax2=int(ymin2+(ymax-ymin)*0.375)
  #ymax=int((xmax-xmin)*0.375+ymin)#250

  #75/200=0.375
  xx=int((xmax-xmin)/8)
  yy=int((ymax-ymin)/2)
  for x in range(xmin,xmax):#200
    for y in range(ymin2,ymax2):#75
      if (4/3)*(y-ymin2)<=x-xmin and (4/3)*(y-ymin2)<=xmax-x: #4/3=200/75/2
        image.putpixel((x,y),n)
  for x in range(xx+xmin,xmax-xx):#225,375
    for y in range(ymin,ymax):#100,300
      a=1
      if y>=ymin+yy:
        if 1.5*(ymax-y)<=(xmax-xx-x) and 1.5*(ymax-y)<=x-(xmin+xx):
          a=0
      if 0.4*(ymax-y)<=(xmax-xx-x) and 0.4*(ymax-y)<=x-(xmin+xx) and a==1:
        image.putpixel((x,y),n)

#On appelle la procédure pour créer une étoile (hors de la boucle principale):
etoile(50,70,50,blanc)

etoile(100,150,30,rouge)

plt.imshow(image)
plt.show()

Télécharger

Etoile
Une étoile en 180 par 120

Traitements des images numériques

Commencer par télécharger, renommer et enregistrer l’image suivante dans votre dossier personnel :

tux_yoda

Voici les codes de l’activité 3

from PIL import Image

#Attention au chemin vers l'image !!
MonImage = Image.open("P:\\SNT\\IMG\\tux_yoda.jpg")

print(MonImage.size)

print(MonImage.getpixel((45, 40)))

MonImage.show()

Télécharger

from PIL import Image

#Attention au chemin vers l'image !!
MonImage = Image.open("P:\\SNT\\IMG\\tux_yoda.jpg")

Taille = MonImage.size

for c in range(Taille[0]):
    for l in range(Taille[1]):
        rgb = MonImage.getpixel((c, l))
        R = rgb[0]
        G = rgb[1]
        B = rgb[2]
        MonImage.putpixel((c, l), (R, 0, B))

MonImage.show()

Télécharger

Niveaux de gris :

Les images à télécharger :

paysage
photo2_NB
message

Fond vert

Une image à télécharger :

cinema

Tester ce code et l’améliorer :

from PIL import Image

#Attention au chemin vers l'image !!
MonImage = Image.open("P:\\SNT\\IMG\\cinema.jpeg")

Taille = MonImage.size

Image_Sans_Vert = Image.new("RGBA", Taille, (0,0,0,0))

for c in range(Taille[0]):
    for l in range(Taille[1]):
        rgb = MonImage.getpixel((c, l))
        R = rgb[0]
        G = rgb[1]
        B = rgb[2]
        if G < 120 :
            Image_Sans_Vert.putpixel((c, l), (R, G, B, 255))
           
Image_Sans_Vert.show()

Télécharger