Images numériquesQu'est-ce qu'un fichier image ?Les couleurs primaires
Nous avons tous entendu parlé des trois couleurs primaires, dites soustractives, qui en fonction des mélanges peuvent donner toutes les autres teintes. On parle de "soustraction" car la lumière arrivant dessus, une partie de celle-ci est absorbée par la matière colorée.
Cependant les écrans d'ordinateur sont composées de pixels qui émettent de la lumière. On n'a alors besoin là aussi que de trois couleurs primaires, dites additives, pour obtenir toutes les teintes. Les couleurs primaires additives sont le rouge, le vert et le bleu. C'est pour cela qu'au sein d'un pixel se trouve trois leds pouvant émettre diverses intensité de chacune de ces couleurs.
Red
50
Green
50
Blue
50
Les images en informatique
Lorsqu'une image s'affiche sur un écran d'ordinateur c'est en fait un grand nombre de pixels qui prennent chacun une certaine couleur au sein d'un rectangle.
Ainsi, pour afficher une image de 100px de large par 100px de haut, l'ordinateur à besoin d'avoir trois informations pour chacun de ces 10 000 pixels. Chacune des ces informations représente le degré de rouge, de vert et de bleu. Généralement, le nombre associé à ce degré est un octet, donc compris entre 0 et 255. Ainsi on a besoin de 24 bits par pixel, soit un total de 24 000 bits pour cette image, ce qui converti donne approximativement 23,44 Kio.
Voici trois images, chacune de dimension 100px×100px :
Enregistrer chacune de ces images sur votre ordinateur et regarder leur taille. Comment expliquer ces différences ?
1 -- Vocabulaire
La définition d’une image est donnée par le nombre de points la composant. Pour une image numérique cela correspond aux nombres de pixels composant l’image en hauteur et en largeur.
La résolution d’une image est définie par un nombre de pixels par unité de longueur. Plus ce nombre est élevé, plus la quantité d’information qui décrit cette structure est importante et plus la résolution est élevée. La résolution d’une image numérique définit le degré de détail de l’image. Ainsi, plus la résolution est élevée, meilleure est la restitution.
Les différents formats
Tout fichier image ne contient pas seulement les bits nécessaires pour éclairer les pixels, mais également des données d'entête qui permettent par exemple de sauvegarder sa signature (pour connaître son format), sa taille, le taux de compression, la date de création, les coordonnées GPS etc.
Comme nous avons pu l'apercevoir dans l'exercice précédent, il existe plusieurs formats de fichiers images. Nous allons décrire ici les plus utilisés.
BMP (BitMaP)
C’est l’un des premiers formats d’images utilisé sous Windows, il a été développé par Microsoft et IBM. Ce format est libre et open source.
Extension : .bmp.
Nombre de couleurs supportées : 2 à16 millions.
Avantages : Les fichiers utilisant ce format ne sont pas compressés et il n’y donc pas de perte de données. N’étant pas compressé, les images ayant la même définition auront la même taille.
Inconvénients : L’inconvénient majeur est que les images stockées sous ce format sont lourds (environ 1,5 Mo pour une image de 800x600 pixels), il est donc peu utilisé sur le web.
JPEG (Joint Photographic Expert Group)
Norme libre de tous droits, créée en 1992, elle définit le format d’enregistrement et l’algorithme de décodage pour la représentation numérique compressé d’une image fixe.
Extensions : .jpg, .jpeg, .JPG, .JPEG.
Nombre de couleurs supportées : 16 millions.
Avantages : La compression de ce type de format peut être réglée, par contre elle se fait toujours avec des pertes. L’ordre de compression d’un fichier JPEG est de 3 à 100 fois par rapport au fichier d’origine, ce taux de compression reste le meilleur. Cela permet de pouvoir charger des images rapidement, c’est un format standard apprécié du web.
Inconvénients : C’est un format qui ne supporte ni la transparence, (le fond doit toujours avoir une couleur, souvent blanche), ni les animations . Lorsqu’on l’utilise, la forte compression des fichiers se fait ressentir sur la qualité de l’image. Il ne possède pas de palette de couleurs associée, ces dernières peuvent donc varier entre les différentes machines et les différents systèmes.
GIF (Graphics Interchange Format)
Très connu sous l’acronyme GIF, il est mis au point en 1987 par CompuServe et H&R Block pour permettre le téléchargement d’images en couleur. C’est un format très utilisé sur le web malgré certaines de ses faiblesses.
Extension : .gif.
Nombre de couleurs supportées : 256 maximum.
Avantages : Format sans perte, il supporte aussi la transparence et l’animation. Les fichiers .gif sont de petites tailles du fait que ce format ne peut enregistrer que 256 couleurs.
Inconvénients : Seulement 256 couleurs, ce qui est peu par rapport aux autres formats. Son plus gros inconvénient est donc lié à un de ses avantages. Il est évident que c’est un format déconseillé pour les photographies.
PNG (Protable Network Graphic)
Format libre de droits et open source, il a été développé à l’origine par la W3C (World Wilde Web Consortium) propriétaire du GIF en vue de son remplacement, dû entre autres à ses limitations.
Extension : .png
Nombre de couleurs supportées : Selon les fichiers 256 ou moins, et jusqu'à 16 millions.
Avantages : Le format destiné à devenir le futur standard d’internet car comme le .gif, il supporte la transparence mais aussi 16 millions de couleurs ! De plus, les fichiers sont de taille raisonnable car il permet la compression sans perte de données, cette compression est d’ailleurs réputée pour son efficacité. Il offre donc une image avec un excellent rendu des différentes nuances et dégradés.
Inconvénients : C’est un format qui ne supporte pas les animations.
Les différents formats de fichiers précédents font partie de la famille des images matricielles : c'est-à-dire que l'image est représentée par un tableau de nombres.
Il existe cependant un autre type de format de fichier image, le vectoriel. Sous ce format l'image est créée à partir d'équations mathématiques, et chaque forme dépend des paramètres hauteur, largeur et rayon donnés à des vecteurs. À l'inverse de l'image matricielle composée de pixels, l'image vectorielle peut être redimensionnée sans pour autant perdre en qualité.
Manipulation en Python
Il existe plusieurs bibliothèques Python permettant de travailler avec des fichiers images. Nous devrons pour cela importer certains modules dont l'intérêt principal pour nous sera de transformer une image dans un certain type de tableau, ou de transformer ce type de tableau en image.
Il faut faudra tout d'abord enregistrer dans un répertoire prévu à cet effet l'image ci-dessous :
Le code de base ressemblera à :
import matplotlib.image as mpimg
import matplotlib.pyplot as plt
import numpy as np
js_image = mpimg.imread('isn_011.png')
On importera les modules matplotlib et numpy en donnant un nom "raccourci" à certaines de leurs fonctions.
On importera la "matrice" associée à notre image dans le tableau js_image.
En utilisation l'instruction :
ce qui veut dire que chaque élément de notre tableau est un tableau composé de plusieurs tableaux dont les éléments sont à leur tour des tableaux de trois nombres.
L'instruction :
print(js_image[0][0])
donne :
[0.5019608 0.5568628 0.69411767]
Il est important de connaître la taille de chacun de ces tableaux, pour cela entrer les instructions :
import matplotlib.image as mpimg
import matplotlib.pyplot as plt
import numpy as np
js_image = mpimg.imread('isn_011.png')
n = len(js_image)
m = len(js_image[0])
print(n)
print(m)
Nous allons utiliser ce tableau pour créer une nouvelle image à partir d'un autre tableau de même dimension.
Notre tableau js_image est en fait un tableau de type numpy composé de $n\times m$ éléments de la forme [r,g,b] où r,g et b sont des nombres compris entre 0 et 1 symbolisant l'intensité du rouge, du vert et du bleu au niveau des pixels. Ces nombres sont ici codés sur 32 bits.
Pour créer une nouvelle image à partir d'un nouveau tableau, il faudra donc dans un premier temps déclarer un tableau du type numpy dont le type de données est encodé en 32 bits. L'instruction correspondante est :
new_image = np.zeros((n, m, 3), dtype=np.float32)
Expliquer ce que fait le programme suivant. On expliquera en détails les instructions des trois boucles for imbriquées.
import matplotlib.image as mpimg
import matplotlib.pyplot as plt
import numpy as np
js_image = mpimg.imread('isn_011.png')
n = len(js_image)
m = len(js_image[0])
new_image = np.zeros((n, m, 3), dtype=np.float32)
for i in range(0,n):
for j in range(0,m):
for k in range(0,3):
new_image[i][j][k] = js_image[i][m-1-j][k]
mpimg.imsave('isn_011a.png',new_image)
Écrire un programme Python qui crée une nouvelle image obtenue par symétrie horizontale de isn_011.png.
Écrire un programme Python qui crée une nouvelle image de dimension 100×100 extraite de isn_011.png.
Écrire un programme Python qui crée une nouvelle image de dimension 600×400 représentant le drapeau de votre choix.
Écrire un programme Python qui crée une nouvelle image similaire à isn_011.png mais teintée en rouge.
Écrire un programme Python qui crée une nouvelle image à partir de isn_011.png mais dont les valeurs sont modifiées en appliquant une fonction mathématique de votre choix : fonction carrée, racine carrée, etc.