snt
Sciences Numériques et Technologie en classe de seconde au Lycée Saint-Exupéry de La Rochelle.
SNT Thème 5
La photographie numérique est un domaine qui a connu un fort développement depuis les années 2000 avec l'apparition des appareils photo numériques. Elle consiste à prendre des photos en utilisant des capteurs numériques pour convertir la lumière en données numériques, plutôt que de les enregistrer sur un film analogique comme c'était le cas avec les appareils photo traditionnels.
L'histoire de la photographie numérique débute avec la première caméra numérique Kodak DCS 100 en 1991, qui utilisait un capteur de 1,3 million de pixels. Depuis lors, les capteurs ont considérablement évolué en termes de résolution et de qualité, permettant à la photographie numérique de devenir un moyen courant de prendre des
photos.
Python est un outil utile pour la manipulation et le traitement d'images numériques. Le module Python Image Library (PIL) est souvent utilisé pour ce faire. Il permet de charger, manipuler et enregistrer des images en plusieurs formats, y compris les formats JPEG, PNG, BMP et GIF. Il offre également des fonctionnalités telles que la modification des couleurs et des tailles d'images, le redimensionnement, la rotation et la modification des niveaux de luminosité et de contraste.
Voici un exemple simple de code Python utilisant PIL pour ouvrir une image et la redimensionner :
from PIL import Image
# Ouvrir une image
im = Image.open("image.jpg")
# Redimensionner l'image
im_resized = im.resize((800, 600))
# Enregistrer la nouvelle image
im_resized.save("image_resized.jpg")
Image numérique : image acquise, créée, traitée, stockée numériquement
Dimensions : taille de l'image en pouces...
ex. 12" 1 pouce = 2,54 cm
Définition : taille de l'image en pixels
ex. 640 \(\times\)480 px 4K = 4096 \(\times\)2160 px
Résolution : en dpi ou ppp
ex. 300 dpi
\(=\dfrac{définition}{dimension}\)
\(résolution=\dfrac{définition}{dimension}\)
donc \( définition=résolution \times dimension\)
donc \(dimension=\dfrac{définition}{résolution}\)
\( définition=résolution \times dimension\)
codage de couleurs (ou profondeur de couleurs) : nombre de bits par pixels (bpp)
Le poids de l'image est de 160 ko.
Le poids de l'image est de 300 ko.
Chaque pixel peut prendre environ 16,7 millions de couleurs possibles.
Environ 4,3 milliards de nuances possibles par pixel.
JPEG
TIFF
EXIF : Exchangeable image file format
1. Charger l'image et executer le programme
from PIL import Image
# Charger le module Image à partir de PIL
ma_photo = ('chat.jpg')
img = Image.open(ma_photo)
print(img.format, img.size, img.mode)
# Afficher format, taille(LxH) et mode de l'image
img.show()
im = Image.open(ma_photo).convert('L')
im.save('chat_gris.jpg')
im.show()
# Fin partie 1
im2 = im.transpose(Image.FLIP_LEFT_RIGHT)
im2.save('chat_gris_regard_a_gauche.jpg')
im2.show()
# Fin partie 2
im3 = im2.point(lambda i: i * 1.5)
im3.save('chat_gris_regard_a_gauche_lambda.jpg')
im3.show()
# Fin partie 3
img.convert("L")
La "valeur" d'un pixel varie de 0 (le noir) à 255 (le blanc), c'est sa luminosité
2. Combien de transformations ?
im.transpose(Image.FLIP_LEFT_RIGHT)
im2.point(lambda i: i * 1.5)
La valeur de chaque pixel est multipliée par 1,5.
La méthode point(), permet d'agir sur chaque pixel.
3. Convertir en une image en niveaux de gris :
La conversion de l’image en couleurs en nuance de gris (“L’’) s’effectue selon la norme de l’UIT (Union Internationale des Télécommunications) ITU-R 601 par la formule suivante :
L = 0,299R + 0,587V + 0,114B
Dans la documentation de référence de Python (lien ci-dessous), voir la fonction Image.convert.
https://pillow.readthedocs.io/en/stable/reference/Image.html
4. à 7. Modifier et améliorer
Étape 1. Analyser un programme
La ligne 8 permet de convertir l’image en mode RGB ou RVB.
img_rgb = img.convert('RGB')
Cette ligne fusionne les trois canaux monobandes en une image multibandes en inversant les canaux rouge et vert.
2. Expliquez les lignes 14 et 16 du programme.
1. Que permet de réaliser la ligne 8 ?
inv_2 = Image.merge("RGB", (B,V,R))
inv_3 = Image.merge("RGB", (V,R,B))
Cette ligne fusionne les trois canaux monobandes en une image multibandes en inversant les canaux rouge et bleu.
Étape 2. Exécuter un programme et analyser les résultats
Ligne 9 #Convertit l’image en mode RGB ou RVB
Ligne 15 #Fusionne les trois canaux monobandes en une image multibandes en inversant les canaux rouge et bleu
Ligne 17 #Fusionne les trois canaux monobandes en une image multibandes en inversant les canaux rouge et vert
4. Ajoutez les commentaires manquants (lignes 9, 15 et 17) et exécutez le programme (bouton triangle vert).
5. Observez et comparez les images A, B et C obtenues à partir de l’image d’origine (baby.jpeg). À quelles inversions correspondent-elles ?
L’image A correspond à l’inversion 2 : inversion entre le rouge et le bleu.
L’image B correspond à l’inversion 1 : inversion entre le vert et le bleu.
L’mage C correspond à l’inversion 3 : inversion entre le rouge et le vert.
Étape 3. Modifier un programme
from PIL import Image
img = Image.open("baby.jpeg")
R, V, B = img.split()
R = R.point(lambda i:i*1.5)
# Augmente l'intensité du canal rouge
inv2_R = Image.merge("RGB", (B,V,R))
inv2_R.save("inv2_avec_canal_R.jpg")
inv2_R.show()
6. Copiez-collez le programme et exécutez-le.
7. En exploitant le document 2, expliquez quelle est la différence entre l’image A (étape 2) et l’image D.
L’image D est obtenue par inversion entre les canaux rouge et bleu, elle correspond à l’inversion 2 avec comme différence l’augmentation de la luminosité du canal rouge avant transformation.
Le facteur lambda appliqué est de 1,5 et la différence avec l’image A est très légère. On peut distinguer les quelques différences de rendu au niveau du contraste d’ensemble et au niveau de la couleur des yeux.
8. Proposez une ou d’autres modifications, observez et commentez les résultats.
On peut faire plusieurs modifications et transformations en appliquant des facteurs lambdas différents avant les inversions. On donne ci-dessous l’exemple de l’inversion 3 (entre le rouge et le vert) mais avec un lambda de 3 appliqué au canal vert avant inversion.
from PIL import Image
img = Image.open("baby.jpeg")
# Ouvre la photo et la stocke dans la variable img
R, V, B = img.split()
# Retourne un tuple contenant toutes les bandes de l’image
V = V.point(lambda i:i*3)
# Multiplie l’intensité du canal vert par 3
inv3_V = Image.merge("RGB", (V,R,B))
# Fusionne les 3 canaux monobande en une image multibandes en inversant les canaux
inv3_V.save("inv3 avec_canal_V.png")
# Sauvgarde l’image inv3_V (avec augmentation de l’intensité du canal vert)
inv3_V.show()
# Affiche l’image
# *********** Découper l’image ***********
from PIL import Image
from PIL import ImageFilter
img = Image.open('garçon.jpg')
img.show()
print("LxH:", img.size)
xa = 1741; ya = 0; xb = 3979; yb = 2388
rectangle = (xa,ya,xb,yb)
decoupe = img.crop(rectangle)
decoupe.show()
print("lxh:", decoupe.size)
decoupe.save("image_decoupee.jpg")
# *********** Appliquer un filtre ***********
img2 = Image.open('image_decoupee.jpg')
im_filtree = img2.filter(ImageFilter.CONTOUR)
im_filtree.show()
im_filtree.save('image_filtree.jpg')
Ajouter aux emplacements judicieux, les lignes de commentaires données dans le désordre...
# *********** Découper l’image ***********
from PIL import Image
# Charge le module Image depuis PIL
from PIL import ImageFilter
# Charge le module ImageFiler de PIL
img = Image.open('garçon.jpeg')
# Charger l’image
img.show()
# Afficher l’image d’origine
print("LxH:", img.size)
# Afficher la définition de l’image d’origine
xa = 1741; ya = 0; xb = 3979; yb = 2388
# Définir les coordonnées des points a et b
rectangle = (xa,ya,xb,yb)
# Définir la zone de découpage
decoupe = img.crop(rectangle)
# Réaliser la découpe
decoupe.show()
# Afficher l’image découpée
print("lxh:", decoupe.size)
# Afficher la définition de l’image découpée
decoupe.save("image_decoupee.jpg")
# Enregistrer l’image découpée
# *********** Appliquer un filtre ***********
img2 = Image.open('image_decoupee.jpg')
# Charger l’image découpée
im_filtree = img2.filter(ImageFilter.CONTOUR)
# Appliquer un filtre (ici CONTOUR)
im_filtree.show()
# Afficher l’image filtrée
im_filtree.save('image_filtree.jpg')
# Enregistrer l’image filtrée
Exécuter le script.
4. Exprimez la largeur l de l’image découpée en fonction de xa et xb. Calculez sa valeur.
5. Exprimez la hauteur h de l’image découpée en fonction de ya et yb. Calculez sa valeur.
Largeur : l = xb – xa
l = 3 979 – 1 741 = 2 238 px
Hauteur = yb – ya
h = 2388 – 0 = 2 388 pixels
6. Essayez en modifiant la ligne concernée du programme, d’autres filtres à la place de CONTOUR : BLUR, DETAIL, EDGE_ENHANCE, EDGE_ENHANCE_MORE, EMBOSS, FIND_EDGES, SHARPEN, SMOOTH...
EMBOSS
By snt