--> Images numériques Qu'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 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. 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 :
print(js_image)
on voit que ce tableau est de la forme :
[[[0.5019608  0.5568628  0.69411767]
  [0.53333336 0.5882353  0.7254902 ]
  [0.52156866 0.57254905 0.7058824 ]
  ...
  [0.38039216 0.4392157  0.5921569 ]
  [0.36862746 0.42745098 0.5803922 ]
  [0.36078432 0.41960785 0.57254905]]

 [[0.53333336 0.5882353  0.7254902 ]
  [0.52156866 0.5764706  0.7137255 ]
  [0.5411765  0.5921569  0.7254902 ]
  ...
  [0.3764706  0.43529412 0.5882353 ]
  [0.3647059  0.42352942 0.5764706 ]
  [0.3529412  0.4117647  0.5647059 ]]

 [[0.57254905 0.627451   0.7647059 ]
  [0.5803922  0.63529414 0.77254903]
  [0.6117647  0.6627451  0.79607844]
  ...
  [0.3764706  0.43529412 0.5882353 ]
  [0.36078432 0.41960785 0.57254905]
  [0.34509805 0.40392157 0.5568628 ]]

 ...

 [[0.3764706  0.4392157  0.5411765 ]
  [0.38431373 0.44705883 0.54901963]
  [0.41568628 0.47843137 0.5803922 ]
  ...
  [0.4509804  0.49019608 0.59607846]
  [0.44705883 0.4862745  0.5921569 ]
  [0.43137255 0.47058824 0.5764706 ]]

 [[0.37254903 0.43529412 0.5372549 ]
  [0.39607844 0.45882353 0.56078434]
  [0.44313726 0.5058824  0.60784316]
  ...
  [0.5529412  0.5921569  0.69803923]
  [0.5019608  0.5411765  0.64705884]
  [0.5019608  0.5411765  0.64705884]]

 [[0.38039216 0.44313726 0.54509807]
  [0.40784314 0.47058824 0.57254905]
  [0.4509804  0.5137255  0.6156863 ]
  ...
  [0.56078434 0.6        0.7058824 ]
  [0.49803922 0.5372549  0.6431373 ]
  [0.49803922 0.5372549  0.6431373 ]]]

En utilisant :
print(js_image[0])
on obtient :
[[0.5019608  0.5568628  0.69411767]
 [0.53333336 0.5882353  0.7254902 ]
 [0.52156866 0.57254905 0.7058824 ]
 ...
 [0.38039216 0.4392157  0.5921569 ]
 [0.36862746 0.42745098 0.5803922 ]
 [0.36078432 0.41960785 0.57254905]]
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.