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()
Que fait ce programme ?
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
Ecrire un programme qui permet de produire un fichier PPM de l’image qui sera donnée en cours.
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
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
Écrire un programme qui transforme une image en couleurs en une image en niveaux de gris.
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
Écrire un programme qui augmente le contraste d’une image en se fixant comme seuil la valeur (maximum//5).
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
É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.
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
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()