Pixellisation et traitement de l'image

Attentes du programme

zW9G.jpg

Découverte d'une matrice LED


Le Sense HAT est une carte additionnelle du Raspberry Pi . Elle ajoute la capacité de détecter toutes sortes d’informations en utilisant une matrice de LED et faigt partie du projet Astropi. On a la possibilité de l’utiliser en réel ou à l’aide d’un émulateur.

Utilisons l'émulateur trinket, en tapant shift Entrée dans la cellule ci-dessous. Effacer toutes les lignes, puis tapez les lignes ci-dessous. Appuyer sur Stop, puis sur Run. Notez ce qui se passe dans un fichier nommé pixellisation.

zWqE.png

In [7]:
%%html
<iframe src="https://trinket.io/embed/python/91de272f38" width="100%" height="356" frameborder="0" marginwidth="0" marginheight="0" allowfullscreen></iframe>

Découverte du fonctionnement d'un écran LED

La matrice de LED contient 64 LED multicolores. Chacune d’elle est constituée de trois LED plus petites : une rouge, une verte et une bleue.

Comprendre le mélange des couleurs

  1. Selon le principe du mélange de couleurs additif, les couleurs rouge, vert et bleu sont utilisées pour obtenir les autres couleurs. On les appelle les trois couleurs primaires additives.
    Cette figure contient 3 disques présentant la même luminosité, un pour chaque couleur. En l’absence de couleur, le résultat est noir.
    a) Quelles combinaisons de deux couleurs produisent une couleur ? Identifiez-les en complétant votre fichier.


    b) Quel est le résultat de l'ajout des trois couleurs primaires ? Compléter votre fichier.


  2. On peut obtenir plus de couleurs que celles de la figure 4, en faisant varier la luminosité des trois couleurs d’origine utilisées. Saisissez le code ci-dessous dans le trinket précédent.
    zWqr.png
    Appuyez sur Run. Notez ce qui se passe dans votre fichier.
  1. Les variables r, g et b représentent les couleurs rouge, vert et bleu. Les nombres qu’elles contiennent spécifient la luminosité de chaque couleur ; elle varie de 0 à 255. Dans le code ci-dessus, la valeur maximale (255) pour chaque couleur a été utilisée. Changez les valeurs pour spécifier 255 red (255 rouge) mais 0 green (0 vert) et 0 blue (0 bleu), puis exécutez de nouveau le code. Quelles autres couleurs pouvez-vous faire ? A vous de jouer ! Combien de couleurs différentes obtient-on ? Notez vos résultats dans votre fichier.



  1. Utilisez le trinket précédent, effacez les lignes et tapez ceci
    zWqs.png
    Notez ce qui se passe dans votre fichier.

Affichage d'images

Un pixel : c’est un petit élément d’une surface de visualisation dans une image numérique. Chaque pixel de votre écran est constitué de trois sous-pixels (rouge, vert et bleu). C’est de cette façon que fonctionnent tous les écrans d’ordinateur et de smartphone.

  1. Pour allumer un pixel on utiliser la commande s.set_pixel(x,y,r,g,b). En utilisant le trinket ci-dessous, tapez et compléter le code ci-dessous pour allumer le pixel(0,0) en rouge.
    zWyf.png
In [8]:
%%html
<iframe src="https://trinket.io/embed/python/91de272f38" width="100%" height="356" frameborder="0" marginwidth="0" marginheight="0" allowfullscreen></iframe>
  1. Les variables « x » et « y » sont utilisées pour contrôler la LED que la commande set_pixel doit changer. x correspond à l'abscisse et varie de 0 à 7 de gauche à droite. y correspond à l'ordonnée et varie de 0 à 7 de haut en bas. Si on saisit le code suivant dans une nouvelle fenêtre, colorez la matrice qui s’affichera.
    zWyy.png zWyq.png
  1. Pixelliser ce logo , en utilisant la grille ci-dessous. La couleur d’un carré doit correspondre à la couleur dominante du carré individuel qui compose l'image. Écrivez le code qui va vous permettre d’afficher l’image sur la matrice de LED.
    zW3Z.jpg

Filtres et manipulation d'images

In [2]:
!pip install pillow
from PIL import Image
from IPython.display import HTML
from io import BytesIO
import requests
Collecting pillow
  Downloading https://files.pythonhosted.org/packages/89/3e/31c2e5385d7588016c6f7ac552e81c3fff2bef4bc61b6f82f8177752405c/Pillow-6.2.1-cp37-cp37m-manylinux1_x86_64.whl (2.1MB)
     |████████████████████████████████| 2.1MB 3.4MB/s eta 0:00:01
Installing collected packages: pillow
Successfully installed pillow-6.2.1

Tester le code ci dessous et noter le résultat de l'affichage dans votre fichier réponse. Interprétez ce résultat.

In [3]:
#fifty shades of yoda
r = requests.get('https://img.lght.pics/zW9k.jpg')  #on télécharge l'image
im1=Image.open(BytesIO(r.content))
largeur,hauteur=im1.size
print(largeur)
print(hauteur)
pixels=largeur*hauteur
print(pixels)
im1
225
225
50625
Out[3]:

Nous allons transformer l’image en niveau de gris pixels par pixels. Pour cela nous allons utiliser : getpixel((x,y)) renvoie la couleur du pixel de coordonnées (x,y) sous la forme d’une liste (R,G,B)
putpixel((x,y),couleur) attribue la couleur au pixel de coordonnées (x,y). Testez ceci

In [4]:
#fifty shades of yoda
for x in range(largeur):
  for y in range(hauteur):
    pixel=im1.getpixel((x,y))
    m=(pixel[0]+pixel[1]+pixel[2])//3 #Que fait-on dans cette ligne? Notez cela dans votre fichier réponse
    newpixel=(m,m,m)
    im1.putpixel((x,y),newpixel)
im1
Out[4]:

On a modifié le programme, tester le! Que se passe-t-il? Notez cela dans votre fichier réponse.

In [5]:
for x in range(largeur):
  for y in range(hauteur):
    pixel=im1.getpixel((x,y))
    newpixel=(pixel[0],pixel[1],255)
    im1.putpixel((x,y),newpixel)
im1
Out[5]:

On dira que l’image est saturée en …. A vous de jouer : modifier votre programme pour saturer en vert, puis en rouge. Notez les changements effectués dans le fichier réponse.

Photomaton


zWmL.jpg
Testez et commentez ce programme.

In [6]:
r = requests.get('https://img.lght.pics/zW9k.jpg')  #on télécharge l'image
im1=Image.open(BytesIO(r.content))
l,h=im1.size
newimg=Image.new(im1.mode, im1.size)
for y in range(h):
  for x in range(l):
    couleur = im1.getpixel((x,y))
    if x%2==0 and y%2==0:  # x et y sont pairs
      newimg.putpixel((x//2,y//2),couleur)
    elif x%2==0:           # Expliquez et commentez cette ligne
      newimg.putpixel((x//2,h//2+y//2),couleur)
    elif y%2==0:           # Expliquez et commentez cette ligne
      newimg.putpixel((l//2+x//2,y//2),couleur)
    else:                  # Expliquez et commentez cette ligne
      newimg.putpixel((l//2+x//2,h//2+y//2),couleur)
newimg
Out[6]:

Pop Art

Modifiez le code ci-dessus pour obtenir un effet à la Warrohl!



Stéphane Renouf, lycée Beaussier