Image numérique :

Une image numérique est réalisée à l'aide de points élémentaires appelés "pixels" (abréviation anglaise de "picture elements").

En ce sens elle reproduit l'idée des peintres pointillistes :

800px-Robert_Delaunay,_1906,_Portrait_de_Metzinger,_oil_on_canvas,_55_x_43_cm,_DSC08255.jpg

Robert Delaunay, 1906, Portrait de Metzinger

(source wikipedia)

L'hexadécimal

L'hexadécimal :

On connaît la représentation décimale des nombres qui est notre façon habituelle de les représenter dans une base 10, constituée de 10 chiffres (0, 1, 2 ... 9)

On a vu la représentation binaire des nombres qui se fait en base 2 avec seulement deux chiffres : les deux chiffres utilisés pour représenter tous les nombres sont le 0 et le 1

L'hexadécimal est une base 16 : elle pourra donc représenter des nombres à l'aide de 16 chiffres. Il y a un fort lien arithmétique entre la base 2 et la base 16. En base 16 deux chiffres suffiront pour représenter un octet (qui nécessite 8 chifres en base 2  ou 3 en base 10). Cette base 16 a donc tout de suite été utilisée dans les débuts de l'nformatique pour représenter de façon compacte les octets. Comme les premiers ordinateurs ne disposaient pas de ressources graphiques importantes, on n'a pas inventé 16 graphes nouveaux pour représenter les 16 chiffres de cette base : on a repris tout simplement les 10 chiffres de la base 10 et on a ajouté six ... lettres pour constituer les autres chiffres :

Hexadécimal 0 1 2 3 4 5 6 7 8 9 A B C D E F
Décimal  0   1   2   3   4   5   6   7   8   9  10 11 12 13 14 15

 

L'écriture des nombres dans cette base est positionnelle comme en base 2 ou en base 10 :

Position 3 2 1 0
Poids 163 162 161 160
Exemple 1 1 0 0 0
Exemple 2 A 3 D E
Exemple 3 0 0 F F

 

  • Exemple 1 : "1000" en hexadécimal = 1x163 + 0x162 + 0x161 + 0x160 = 4096 en décimal
  • Exemple 2 : "A3DE" en hexadécimal = 10x163 + 3x162 + 13x161 + 14x160 = 41950 en décimal
  • Exemple 3 : "00FF" en hexadécimal = 0x163 + 0x162 + 15x161 + 15x160 = 255 en décimal

Ce dernier exemple montre que la valeur maximum d'un octet est représentable par le nombre hexadécimal FF, la valeur minimum étant bien sûr en hexadécimal 00.

Pour une raison de compacité on a pris l'habitude de représenter les octets avec la notation hexadécimale.

L'éditeur hexadécimal :

C'est un logiciel qui va permettre de visualiser et éventuellement de modifier le contenu de tout type de fichier.

Il peut nous servir à comprendre comment est constitué un fichier, mais également, lorsqu'un programme que l'on écrit est censé enregistrer un fichier, à voir si le fichier produit est bien conforme à ce qui est attendu.

Il en existe de nombreux qui fonctionnent tous plus ou moins de la même façon. Nous prendrons comme exemple l'éditeur Bless Hex Editor (GNU/Linux). Sous Windows, on pourra utiliser le logiciel CR-Hexact .

 

Visualisation d'un fichier :

Voici un exemple d'un petit fichier texte (tapé dans un éditeur de texte - Gedit) :

texte_simple_r.png

puis sa visualisation avec Bless Hex Editor :

bless_1.png

La fenêtre de visualisation/édition d'un éditeur hexadécimal comporte toujours trois parties :

- au centre, on a l'affichage des différents octets qui constituent le fichier. Chacun de ces octets est affiché en hexadécimal, et peut donc prendre qu'une valeur entière comprise entre 00 et FF (256 valeurs possibles entre 0 ("00") et 255 ("FF")).

- à gauche (en rouge ici) les "adresses" de chaque premier octet de chacune des lignes d'octets affichés. Ces adresses sont écrites elles aussi en hexadécimal et sont ici codées sur 4 octets. Ce ne sont pas les adresses physiques réelles (sur le disque dur ou en mémoire) mais des adresses relatives, celle du premier octet étant arbitrairement notée 00000000.

Astuce : l'éditeur hexadécimal a été configuré ici pour afficher 16 octets par ligne. Ainsi l'adresse du  premier octet de la première ligne étant 00000000, celle du premier octet de la ligne suivante sera 00000010, puis 00000020 etc. (Attention, 00000010 en hexadécimal = 16 en décimal !). Ceci permet un repérage plus rapide des adresses.

- à droite, on a une fenêtre de visualisation en ASCII (American Standard Code for Information Interchange) des octets situés dans la zone centrale. Pour un fichier texte pur (créé avec un éditeur de texte), la visualisation ASCII prend tout sons sens et on retrouve octet après octet, le contenu du fichier texte. En effet, si on regarde une table des codes ASCII (récupérée sur Wikipédia ) :

ascii.png

on constate que le chiffre 0 (attention on parle bien de symbole et pas de nombre !!!) est codé par la valeur 30, la lettre A par la valeur 41, la lettre a par la valeur 61 ou le z par la valeur  7A.

A remarquer ici : l'éditeur de texte a enregistré un code supplémentaire "OA" en fin de fichier. En consultant la table ASCII ci-dessus, on constate que ce code ne correspond pas à un symbole imprimable : c'est l'un des caractères de contrôle (sur fond rose dans cette table). Il correspond au code LF (Line Feed : saut de ligne qui est une marque sous Linux de la fin de ligne). Les caractères non imprimables sont généralement remplacés dans la partie visualisation par un point (".")

Ci-dessous, voici un autre exemple d'une petite partie d'un gros fichier de type son visualisé avec un tel éditeur. Il s'agit d'un fichier wav copié sur le disque dur à partir du CD audio original (Stella by starlight interprété par Miles Davis - Sessions de 1958). Le fichier n'est plus de type texte comme précédemment : c'est un fichier qualifié de binaire. (Dans cette partie du fichier wav, les octets servent à représenter les valeurs numérisées du signal sonore à reproduire. La partie droite (l'affichage en ASCII) n'a alors aucun intérêt :

bless_2.png

 

On utilisera un logiciel de ce type pour "visualiser" des fichiers de type image puisque c'est l'objet de notre étude !

 

Image N&B

 

(Ce type d'écran est qualifié aussi de "monochrome")

Exemple 1 : calculatrices.

Caractéristiques de la TI-82 Stats.fr :

  • Écran de 8 lignes de 16 caractères, 96x64 pixels.

ecran_calculette.png

Rque : cette copie d'écran n'est pas celle

d'une TI 82, mais le principe d'affichage est le même

Sur ce type d'écran comportant "peu" de pixels (96x64 = 6144 pixels ... à comparer aux écrans de PC ou de portables qui sont en millions de pixels), la pixellisation est déjà bien visible à l'oeil nu.

Avec une loupe :

loupe_lcd.png

on voit très bien la formation des caractères par juxtaposition de ces pixels :

Une surface de 6x8 pixels est réservée pour chaque caractère. Observer la lettre S :

  • on compte 7 pixels en hauteur, le 8ème est non utilisé pour faire un espacement entre deux lignes consécutives
  • et 5 pixels en largeurs, le 6ème est non utilisé pour faire l'espacement entre deux caractères consécutifs

Exemple 2 : écran LCD (128 x64 pixels) dont on a pu récupérer la notice (« datasheet ») :

ecranlcd1.jpg

ecran_lcd2.png

Sur ces types d'écran, un pixel (« picture element ») est soit allumé (noir) soit éteint (« blanc »). Chaque pixel peut donc être piloté par un seul bit (« binary element ») mis à 1 ou à 0. Un octet suffit alors à coder 8 pixels.

Remarquer le nombre de pixels dont disposent ces écrans : 96x64 pour l'un, 128x64 pour l'autre.

- Que constate-t-on (de quel multiple sont ces nombres) ?

Dans le cas de l'afficheur 128x64, un octet permet de piloter 8 pixels disposés sur une même verticale. Ecrire le code binaire, (puis sa conversion en décimal), nécessaire à la réalisation du motif compris entre les colonnes Y1 et Y6 (une lettre S), en supposant que l'allumage d'un pixel (= pixel noir sur ce type d'afficheur) est réalisé par un niveau 1 et son extinction par un niveau 0 :

lettre_S_Corrige.png

Cas d'une image codée en niveaux de gris

On parle souvent de photographies en « Noir et Blanc » pour ce type d'images mais le terme est impropre car on y voit surtout du gris !

Phare_Gatteville_1.png

Dans ces images chaque pixel peut avoir une teinte plus ou moins grise, comprise entre le blanc et le noir.

 Voici deux images de type bmp (« bitmap) de 20x10 pixels, très petites donc, mais fortement agrandies, suivies d'une partie de l'analyse du fichier correspondant (Rect_blanc_20x10.bmp et Rect_noir_20x10.bmp ) :

rectangles.png

Chaque pixel est codé à l'aide d'un octet pouvant prendre comme valeurs extrêmes :

 de

      00000000 en binaire soit 0 en décimal ou encore 00 en hexadécimal

à

      11111111 en binaire soit 255 en décimal ou encore FF en hexadécimal

 

Quelle valeur faut-il donner à un octet pour que le pixel correspondant apparaisse :

 - noir :                                - blanc :

 Combien d'octets sont nécessaires pour coder chacune de ces images :

 

On peut changer dans le logiciel de dessin la teinte de quelques pixels ou directement le code dans l'éditeur hexadécimal :

code_blanc_modifie.png

... et voici le résultat :

blanc_modifie.png

Image en niveaux de gris

Cas d'une image codée en niveaux de gris

Les photographies comme celle ci-dessous sont dites en « Noir et Blanc » ce qui est une appellation erronée car elles sont essentiellement constituées de gris !

Phare_Gatteville_1.png

Dans ces images chaque pixel peut avoir une teinte plus ou moins grise, comprise entre le blanc et le noir.

 Voici deux images de type bmp (« bitmap) de 20x10 pixels, très petites donc, mais fortement agrandies, suivies d'une partie de l'analyse du fichier correspondant  (Télécharger ces fichiers pour visualiser leur contenu avec un éditeur hexadécimal et avec un visualiseur d'images : Rect_blanc_20x10.bmp et Rect_noir_20x10.bmp ) :

rectangles.png

Chaque pixel est codé à l'aide d'un octet pouvant prendre comme valeurs extrêmes :

 de

      00000000 en binaire soit 0 en décimal ou encore 00 en hexadécimal

à

      11111111 en binaire soit 255 en décimal ou encore FF en hexadécimal

 

Quelle valeur faut-il donner à un octet pour que le pixel correspondant apparaisse :

 - noir :                                - blanc :

 Combien d'octets sont nécessaires pour coder chacune de ces images :

 

On peut changer dans le logiciel de dessin la teinte de quelques pixels ou directement le code dans l'éditeur hexadécimal. Ici on a remplacé les derniers octets du fichier qui étaient tous codés FF en hexadécimal par la suite d'octets E0, C0, A0, 80, 40, 20, 00.  :

code_blanc_modifie.png

... et voici le résultat :

blanc_modifie.png

 

  • Pour comprendre, compléter le tableau de conversion suivant :

 

Hexadécimal FF E0 C0 A0 80 60 40 20 00
Décimal  255     160         0

 

 

Image en couleurs

Cas d'une image codée en RVB

 C'est le cas de la majorité des images.

Phare_Gatteville_1_rvb.png

Cela provient de la structure des écrans couleurs : chaque pixel est constitué de 3 sous pixels (un rouge, un vert et un bleu).

Voir cette animation :

rvb_ostralo.png

Chaque sous pixel est codé sur un octet.

Combien d'octets sont nécessaires pour coder une image de 20x10 pixels ?

 

Combien de couleurs différentes un tel codage permet-il de réaliser ?

 

Dans le fichier image du rectangle blanc (Rect_blanc_20x10_RVB.bmp), on a modifié les 9 derniers octets pour changer les trois pixels en haut à droite de l'image blanche initiale  :

Code_rect_blanc_rvb_modif.png

et voici le résultat :

rect_blanc_rvb_modif.png

TP Image

Un petit TP facile à faire chez soi.

On aura besoin :

cosmos_reduit.png

Sorry, the PDF could not be displayed. Click here to download the PDF

Une animation d'intérêt sur le thème de l'image numérique (sur le site ostralo.net) :

image_ostralo.png

Un exercice de type bac sur ce thème : Thermographie infra-rouge

Cours et activités sur la partie du programme "Transmettre et stocker l'information" :