Traitement d'images

Une matrice

On considère le programme suivant :

Ecriture d'une matrice


from math import *
fichier = open("MatriceExemple.txt","w")
liste = [['' for i in range(20)] for i in range(20)]
for i in range(20):
    for j in range(20):
        if abs(i-j) < 5:
            liste[i][j] = '*'
        elif 5 <= abs(i-j) < 10:
            liste[i][j] = '+'
        else :
            liste[i][j] = '#'
for i in range(20):
    chaine = ''
    for j in range(20):
        chaine = chaine+' '+ str(liste[i][j])
    print(chaine,file=fichier)
fichier.close()
  1. Que fait ce programme ?
  2. Modifier ce programme pour qu’il affiche la matrice ci-contre :

Résolution de l'exercice "matrice".


from math import *
fichier = open("MatriceExemple.txt","w")
liste = [['' for i in range(20)] for i in range(20)]
for i in range(20):
    for j in range(20):
        if abs(i-j) < 3:
            liste[i][j] = '0'
        elif 3 <= abs(i-j) < 8:
            liste[i][j] = '*'
        else :
            liste[i][j] = ' '
for i in range(20):
    chaine = ''
    for j in range(20):
        chaine = chaine+' '+ str(liste[i][j])
    print(chaine,file=fichier)
fichier.close()

Fichier PPM

    Question 1

  1. Ecrire un programme qui permet de produire un fichier PPM de l’image qui sera donnée en cours.
  2. Production d'un fichier PPM

    from PIL import Image
    # Charger l’image qu’on nomme img
    img = Image.open('Joconde.jpg')
    #Définir les dimensions de l’image
    w,h = img.size
    
    fichier = open("Joconde.ppm","w")
    print("P3",file=fichier)
    print("#",file=fichier)
    print(w,file=fichier)
    print(h,file=fichier)
    print(255,file=fichier)
    
    
    #Initialiser les 3 composantes RVB de l’image
    
    for j in range(0,h):
        for i in range(0,w):
            p = img.getpixel((i,j))
            
            print(p[0],file=fichier)
            print(p[1],file=fichier)
            print(p[2],file=fichier)
    
    fichier.close()

    Question 2

  3. Ecrire un programme qui permet de lire un fichier PPM et d’afficher dans une fenêtre l’image associée à ce fichier.

Affichage de l'image à partir d'un fichier PPM

from tkinter import *

fen = Tk()
fen.title("Joconde")

fichier = open("Joconde.ppm","r")
s = fichier.readline()
s = fichier.readline()
largeur = eval(fichier.readline())
hauteur = eval(fichier.readline())
maximum = eval(fichier.readline())

Fond = Canvas(fen, width = largeur, height = hauteur, bg = "white")
Fond.pack()

rouge = [[0 for j in range(0,hauteur)] for i in range(0,largeur)]
vert = [[0 for j in range(0,hauteur)] for i in range(0,largeur)]
bleu = [[0 for j in range(0,hauteur)] for i in range(0,largeur)]

for j in range(hauteur):
        for i in range(largeur):
            rouge[i][j] = eval(fichier.readline())
            vert[i][j] = eval(fichier.readline())
            bleu[i][j] = eval(fichier.readline())
            couleur = "#%02x%02x%02x" % (rouge[i][j],vert[i][j],bleu[i][j]) 
            Fond.create_rectangle(i,j,i,j,outline = couleur)
            
fichier.close()

fen.mainloop()

Transformer une image

    Question 1

  1. Écrire un programme qui transforme une image en couleurs en une image en niveaux de gris.
  2. Savoir-faire : transformer une image en couleurs en une image en niveaux de gris.

    Méthode

    On remplace chaque pixel de couleur r, v, b par un pixel dont le niveau de gris est la moyenne des nombres r, v et b.

    Image en niveaux gris

    from PIL import Image
    from tkinter import Tk
    from tkinter import Canvas
    
    fen = Tk()
    fen.geometry("600x700")
    fen.title("Gris")
    
    
    fichier = open("Joconde.ppm","r")
    
    s = fichier.readline()
    s = fichier.readline()
    largeur = eval(fichier.readline())
    hauteur = eval(fichier.readline())
    maximum = eval(fichier.readline())
    
    Fond=Canvas(fen,width=largeur,height=hauteur,bg="white")
    Fond.place(x=0,y=0)
    
    
    rouge = [[0 for j in range(0,hauteur)] for i in range(0,largeur)]
    vert = [[0 for j in range(0,hauteur)] for i in range(0,largeur)]
    bleu = [[0 for j in range(0,hauteur)] for i in range(0,largeur)]
    
    gris = [[0 for j in range(0,hauteur)] for i in range(0,largeur)]
    
    for j in range(hauteur):
            for i in range(largeur):
                    rouge[i][j] = eval(fichier.readline())
                    vert[i][j] = eval(fichier.readline())
                    bleu[i][j] = eval(fichier.readline())
                    gris[i][j] = (rouge[i][j]+vert[i][j]+bleu[i][j])//3
                    couleur = "#%02x%02x%02x" % (gris[i][j],gris[i][j],gris[i][j])
                    Fond.create_rectangle(i,j,i,j,outline=couleur)
    
    fichier.close()

    Question 2

  3. Écrire un programme qui augmente le contraste d’une image en se fixant comme seuil la valeur (maximum//5).
  4. Savoir-faire : augmenter le contraste d’une image en niveaux de gris.

    Méthode

    On fixe un seuil et on remplace tous les pixels plus clairs que ce seuil par un pixel blanc et tous les pixels plus sombres que ce seuil par un pixel noir.

    Indication

    for j in range(0,hauteur):
        for i in range(0,largeur):
            if gris[i][j] <= maximum//5:
    	     grisbis[i][j] = 0
    	 else :
         grisbis[i][j] = maximum

    Augmenter le contraste d'une image en niveaux gris

    from PIL import Image
    from tkinter import Tk
    from tkinter import Canvas
    
    fen = Tk()
    fen.geometry("600x700")
    fen.title("Noir&Blanc")
    
    
    fichier = open("Joconde.ppm","r")
    
    s = fichier.readline()
    s = fichier.readline()
    largeur = eval(fichier.readline())
    hauteur = eval(fichier.readline())
    maximum = eval(fichier.readline())
    
    Fond=Canvas(fen,width=largeur,height=hauteur,bg="white")
    Fond.place(x=0,y=0)
    
    
    rouge = [[0 for j in range(0,hauteur)] for i in range(0,largeur)]
    vert = [[0 for j in range(0,hauteur)] for i in range(0,largeur)]
    bleu = [[0 for j in range(0,hauteur)] for i in range(0,largeur)]
    
    gris = [[0 for j in range(0,hauteur)] for i in range(0,largeur)]
    
    for j in range(hauteur):
            for i in range(largeur):
                    rouge[i][j] = eval(fichier.readline())
                    vert[i][j] = eval(fichier.readline())
                    bleu[i][j] = eval(fichier.readline())
                    gris[i][j] = (rouge[i][j]+vert[i][j]+bleu[i][j])//3
    
                    if gris[i][j] <= maximum//5:
                            gris[i][j] = 0
                    else:
                            gris[i][j] = maximum
                    couleur = "#%02x%02x%02x" % (gris[i][j],gris[i][j],gris[i][j])
                    Fond.create_rectangle(i,j,i,j,outline=couleur)
            
    fichier.close()
    
    fen.mainloop()

    Question 3

  5. Écrire un programme qui double la taille d’une image en niveaux de gris, en remplaçant chaque pixel par un carré de deux pixels sur deux pixels du même niveau de gris.
  6. Savoir-faire : changer la taille d’une image

    Méthode :

    On calcule la nouvelle image pixel par pixel.

    Indication

    largeurbis = 2*largeur
    hauteurbis = 2*hauteur
    for j in range(0,hauteur):
        for i in range(0,largeur):
    grisbis[i][j] = gris[i//2][j//2]

    Augmenter la taille d'une image

    from PIL import Image
    from tkinter import Tk
    from tkinter import Canvas
    
    fen = Tk()
    fen.geometry("1000x1200")
    fen.title("Zoomer")
    
    
    fichier = open("Joconde.ppm","r")
    
    s = fichier.readline()
    s = fichier.readline()
    largeur = eval(fichier.readline())
    hauteur = eval(fichier.readline())
    maximum = eval(fichier.readline())
    
    Fond=Canvas(fen,width=2*largeur,height=2*hauteur,bg="white")
    Fond.place(x=0,y=0)
    
    
    rouge = [[0 for j in range(0,hauteur)] for i in range(0,largeur)]
    vert = [[0 for j in range(0,hauteur)] for i in range(0,largeur)]
    bleu = [[0 for j in range(0,hauteur)] for i in range(0,largeur)]
    
    gris = [[0 for j in range(0,hauteur)] for i in range(0,largeur)]
    grisbis = [[0 for j in range(0,2*hauteur)] for i in range(0,2*largeur)]
    
    
    for j in range(hauteur):
            for i in range(largeur):
                    rouge[i][j] = eval(fichier.readline())
                    vert[i][j] = eval(fichier.readline())
                    bleu[i][j] = eval(fichier.readline())
                    gris[i][j] = (rouge[i][j]+vert[i][j]+bleu[i][j])//3
    largeurbis = 2*largeur
    hauteurbis = 2*hauteur
    for j in range(hauteurbis):
            for i in range(largeurbis):
                    grisbis[i][j] = gris[i//2][j//2]
                    couleur = "#%02x%02x%02x" % (grisbis[i][j],grisbis[i][j],grisbis[i][j])
                    Fond.create_rectangle(i,j,i,j,outline=couleur)
           
    fichier.close()
            
    fen.mainloop()

    Question 4

  7. Dessiner une image de taille d’au moins 200 pixels par 200 pixels, où la valeur de chaque pixel est aléatoire. Observer le résultat obtenu : n’y a-t-il pas quelques régularités ? Elles sont évidemment dues au hasard : il faut se méfier de sur-interpréter un phénomène aléatoire dans lequel on croit apercevoir des régularités.

Augmenter la taille d'une image

from tkinter import Tk
from tkinter import Canvas
import random

fen = Tk()
fen.geometry("400x400")
fen.title("Aléatoire")


Fond=Canvas(fen,width=400,height=400,bg="white")
Fond.place(x=0,y=0)
l = 200
rouge = [[0 for j in range(l)] for i in range(l)]
vert = [[0 for j in range(l)] for i in range(l)]
bleu = [[0 for j in range(l)] for i in range(l)]
for y in range(0,l):
    for x in range(0,l):
        rouge[x][y] = random.randint(0,255)
        vert[x][y] = random.randint(0,255)
        bleu[x][y] = random.randint(0,255)
        couleur = "#%02x%02x%02x" % (rouge[x][y],vert[x][y],bleu[x][y])
        Fond.create_rectangle(x,y,x,y,outline=couleur)
    
fen.mainloop()