Les images et images animées

Représentation des images : bitmap vs vectoriel

bitmap = on code la suite des points.

vectoriel = on code une description de l'image (rectangles, ellipses, ...)

exemple :

Une droite = {tous les points de cette droite} (bitmap)

= {2 extrémités} (vectoriel)

Bitmap

avantages

1) format proche du hardware (sauf processeur dédié)

2) adaptable aux images complexes

3) Adapté aux traitements d'images (brosse, aérographe, gomme, contraste, ...)

inconvénients

1) modifications spatiales difficiles transformation par réduction => perte d'information

transformation par agrandissement => grossissement des points.

2) Encombrement important.

image vectorielle

On ne stocke que les points caractéristiques de l'image (extrémité d'une droite, centre et un autre point pour un cercle, ...)

avantages

1) adaptable à chaque périphérique (car ajustable, coordonnées relatives, adaptable aux drivers intelligents, ...)

2) stockage moins encombrant (la taille ne dépend que de la complexité du document lui même)

3) adapté aux objets mathématiques et leur extension (voiture, avion , ...)

inconvénients

1) mal adapté aux images quelconques

2) difficulté de traitement d'une partie de l'image

3) travail d'interprétation à faire => temps de traitement => processeur adapté ou UC ?

La couleur

3 canons RGB (Rouge, Vert, Bleu)

valeur numérique -> valeur analogique DAC (convertisseur digitaux analogiques)

Valeur du triplet RGB = une valeur de couleur

exemple :

(0,0, max) => bleu foncé

(0, 0, 0) => noir

l'oeil humain voit 16 millions § 2^24 = 2^(3x8) couleurs => TrueColor

En général on n'a pas 24 bits pour un pixel (i.e. un point élémentaire à l'écran) mais 8. On parle alors de fichier pixmap au lieu de bitmap. Le nombre de bits pour décrire la couleur d'un pixel est appelé la profondeur.

Donc 2^8 = 256 couleurs à un instant donné (choisi parmi 16,7 millions).

Ces 2^8 couleurs sont stockées dans une palette (table de couleur, colormap, look-up table, LUT, palette, É).

Table de couleurs

On repère les couleurs par un indice dans cette colormap.

donc afficher du noir = afficher le pixel d'indice 5

ATTENTION

pixel a deux sens :

- point élémentaire à l'écran

- indice dans une table de couleur

Remarque

Si on change de table de couleur

Table de couleurs (suite)

afficher pixel d'indice 5 = afficher Rouge => flash

Conclusion

Il faudra une table de couleurs dans un fichier d'image

Les divers systèmes de couleurs

Échelles additives

On ajoute des couleurs à la couleur noire.

Plus on ajoute de la couleur plus on rapproche du blanc

exemple : les écrans.

Échelles soustractives

On enlève des couleurs à la couleur blanche (qui "contient" toutes les couleurs).

Plus on ajoute une couleur plus cette couleur absorbe (donc enlève) sa couleur complémentaire.

le cyan absorbe le rouge, le magenta absorbe le vert, le jaune absorbe le bleu.

exemple : l'impression sur papier blanc, la photographie.

Échelle par famille

classement proche de l'humain.

3 notions : famille, saturation, brillance.

- famille des rouge, des verts, ...

- saturation claire à foncée

- l'intensité

Transparence

Une valeur supplémentaire est parfois ajoutée pour décrire le degré de trannsaprence (vitre d'une voiture, ...)

Les divers systèmes de couleurs (suite)

Échelles additives

système RGB.

système YUV : signaux Y (luminance), U et V (chrominances i.e. informations pour la couleur). C'est une transformation linéaire du système RGB. Y est une echelle de gris : c'est le seul coefficient utilisé pour les téléviseurs noirs et blanc. Les téléviseurs couleurs utilisent les 3 coefficients.

Échelles soustractives

système CMY (Cyan, Magenta, Yellow). En fait, les 3 couleurs réunies ne donnent pas un "beau" noir (mais un "vilain" beige). On ajoute alors une composante noir pour obtenir une échelle à 4 valeurs CMYK.

Échelle par famille

système HSV (Hue, Saturation, Value) ou HSB (Hue, Saturation, Brightness).

Hue est la couleur (i.e. la famille)

Saturation (ou chroma) est la "quantité de blanc" dans la couleur : être 100% saturé = couleur "pure", être peu saturé = couleur pâle. par exemple rouge saturé à 50% est un rose.

Value est "l'intensité émise" : grande intensité = très brillant, peu d'intensité = proche du noir.

Correspondance RGB, CMY, HSV

RGB CMY HSV
Rouge 255, 0, 0 0, 255, 255 0, 240, 120
Jaune 255, 255, 0 0, 0, 255 40, 240, 120
Vert 0, 255, 0 255, 0, 255 80, 240, 120
Cyan 0, 255, 255 255, 0, 0 120,240,120
Bleu 0, 0, 255 255,255,0 160,240,120
Magenta 255,0,255 0,255,0 200,240,120
Noir 0,0,0 255,255,255 160,0,0
les gris 63,63,63 ou
127,127,127
ou
191,191,191
191,191,191ou
127,127,127
ou 63,63,63
160,0,59
160,0,120
160,0,180
Blanc 255,255,255 0,0,0 160,0,240

La compression

Divers algorithmes

RLC
Run Length Compression

appelé encore RLE (Run Length Encoding)

Utilisé dans TIFF, BMP, PCX

sans perte

Idée de base : regrouper les points consécutifs ayant même valeur.

Exemple :

aaaaaaaaaaaaaaa

est codé

15a

Inconvénient du RLC

mal adapté aux fichiers ayant peu de répétitions successives (texte, image digitalisé, É)

Lempel-Ziv Welch (LZW)

Jakob Ziv et Abraham Lempel (1977, 78)

implanté par Terry Welch (1984) dans les contrôleurs de disque.

utilisé dans :

- les formats d'images GIF, TIFF 5.0 (1988)

- la norme V42bis des modems

- Postscript niveau 2

- les commandes de compression compress, zoo, ...

utilise un "dictionnaire"

les entrées 0-255 sont les lettres de l'alphabet.

les entrées 256-4095 sont des chaînes (i.e. plusieurs caractères consécutifs)

Chaque entrée est donc sur 12 bits.

En compression on lit les données de sorte à former des chaînes. Si une chaîne construite n'existe pas dans le dictionnaire on crée une entrée dans ce dictionnaire et on l'ajoute.

Donc chaque nouvelle chaîne ajoutée au dictionnaire est formée d'une chaîne déjà existante suivi du "caractère courant".

L'algorithme est :

Algorithme de compression LZW

w := NIL
tant qu'il y a des caractères
   lire un caractère K (sur 8 bits)
   si wK existe déjà dans le dictionnaire
      w := wK (1)
   sinon
      écrire le code de w (sur 12 bits)
      ajouter wK dans le dictionnaire
      w := K (1)
   fsi
fin tant que
écrire code de w (sur 12 bits)

Exemple d'exécution :

chaîne à coder : /QED/QE/QEE/QEB

entrée lue sortie encodée code et valeur correspondante dans la table valeur de w après (1)
/ /
Q / 256 = /Q Q
E Q 257 = QE E
D E 258 = ED D
/ D 259 = D/ /
Q /Q
E 256 260 = /QE E
/ E 261 = E/ /
Q /Q
E /QE
E 260 262 = /QEE E
/ E/
Q 261 263 = E/Q Q
E QE
B 257 264 = QEB B
Fin tant que B

Algorithme de compression LZW (suite)

Le code de la chaîne /QED/QE/QEE/QEB est la première colonne soit :

/ ; Q ; E ; D ; 256 ; E ; 260 ; 261 ; 257 ; B

Pour décoder on a l'algorithme similaire à l'encodage !! :

Algorithme de décompression LZW

w := NIL
tant qu'il y a des caractères
   lire un caractère K (sur 12 bits)
   si code(K) > 255 alors
      le décoder avec le dictionnaire
      le mettre dans la chaîne d'entrée à traiter
(en transformant en 12 bits)
   sinon
      écrire K (sur 8 bits)
      si wK existe déjà dans le dictionnaire
         w := wK (2)
      sinon
         ajouter wK dans le dictionnaire
         w := K (2)
      fsi
   fsi
fin tant que

Exemple d'exécution :

chaîne à décoder :

/ ; Q ; E ; D ; 256 ; E ; 260 ; 261 ; 257 ; B

Algorithme de décompression LZW (suite)

entrée lue sortie décodée code et valeur correspondante dans la table valeur de w après (2)
/ / /
Q Q 256 = /Q Q
E E 257 = QE E
D D 258 = ED D
256
/ / 259 = D/ /
Q Q /Q
E E 260 = /QE E
260
/ / 261 = E/ /
Q Q /Q
E E /QE
261
E E 262 = /QEE E
/ / E/
257
Q Q 263 = E/Q Q
E E QE
B B 264 = QEB B
fin tant que

La sortie décodée est la seconde colonne :

/QED/QE/QEE/QEB

Conclusion sur LZW

- les algorithmes de compression et de décompression construisent évidemment le même dictionnaire.

- compression/décompression sans perte

- rapide pour compresser comme pour décompresser

- on utilise un dictionnaire qui N'est PAS transporté (mais construit au fur et à mesure dans la compression comme dans la décompression)

Les algorithmes de compression avec perte

Théorème

Pour tout programme de compression sans perte, pour tout entier N, il existe un fichier de taille > N qui n'est pas compressé strictement.

remarque préliminaire :

Dans un programme de compression sans perte deux fichiers distincts donnent 2 fichiers compressés distincts.

démonstration :

Par l'absurde

Soit un programme de compression qui diminue strictement les fichiers de taille plus grand que N. Supposons que tous les fichiers de taille supérieure à N compressés par ce programme le sont sans perte. Montrons qu'on arrive à une contradiction.

On considère tous les fichiers de taille exactement N bits.

Il y en a 2^N.

Tous les fichiers ont au plus N-1 bits (compression stricte)

Or il y a :

- 2^(N-1) fichiers de N-1 bits

- 2^(N-2) fichiers de N-2 bits

- ...

- 1 fichier de taille 0 bit

donc on obtient 2^N-1 fichiers compressés (2^(N-1) + 2^(N-2) + ... + 1)

En résumé

Au départ 2^N fichiers à compresser

A l'arrivée 2^N - 1 fichiers compressés.

donc 2 fichiers distincts ont donné le même fichier compressé contradiction

Remarque

démonstration purement mathématique pas de théorie de l'information.

Conclusion

Le théorème dit donc qu'un programme de compression strict sans perte n'existe pas.

Un programme de compression strict est un programme de compression avec perte.

JPEG

= Joint Photographic Experts Group (le comité dépendant de l'ISO qui initialement a écrit ce standard)

écrit par Tom Lane, Philip Gladstone and al

si problème difficile les joindre à

jpeg-info@uu.net ou encore

Tom_Lane@g.gp.cs.cmu.edu

utilisé par :

- JFIF (JPEG File Interchange Format)

- TIFF 6.0 (Juin 1992)

- TGA, É

algorithme avec perte donc

- usage limité à des données dont les changements sont imperceptibles pour un humain (son, image mais pas programme ou fichier de données quelconques)

- éviter les phases successives de compression/décompression

- meilleure performance (taux de compression 20:1, rapidité de compression/décompression)

L'oeil humain est plus sensible aux changements de brillance que de couleurs voisines => JPEG plus performant pour des couleurs que pour le noir et blanc.

JPEG (suite)

peut manipuler la TrueColor (16 millions de couleur) !! (alors que GIF seulement 256 couleurs) donc très performant sur des écrans 24-bit => le format du futur ?

La qualité de compression et la qualité du résultat est paramétrable par l'utilisateur (le facteur Q)

Implantation de JPEG

C'est difficile !!

voir le code disponible à ftp.uu.net fichier

/graphics/jpeg/jpegsrc.v5.tar.gz

utilise le codage d'un pixel en

luminance Y = 0,6G+0,3R+0,1B

2 signaux de chrominance

U = Y-B et V = Y-R

Implantation du codage JPEG

- Division de l'image (système YUV) en blocs de 8x8 pixels

- On applique la DCT (Discrete Cosine Transform) à chaque bloc (FDCT = Forward DCT)

- Quantification des coefficients => perte d'informations paramétrable avec "facteur de qualité"

- "codage entropique" (sans perte)

Implantation du décodage JPEG

Pour décoder on fait les opérations inverses

Les différentes parties du codage JPEG : la DCT

FDCT et IDCT utilisent les équations :

pour encoder les blocs de 8x8 bits

et

pour décoder

avec

pour u, v=0

et

pour sinon

Les différentes parties du codage JPEG : la quantification

C'est la principale source de perte d'information de l'algorithme.

On divise chaque coefficient F(u,v) par son coefficient de quantifieur associé et on arrondi à l'entier le plus proche :

la déquantification est :

Les tables de quantification sont par exemple des tables "normalisées" CCIR-601

Les différentes parties du codage JPEG : l'entropie

elle utilise un algorithme d'Huffman

Conclusion sur la compression

Compresser est une chose. Le format des fichiers images en est une autre.

On peut avoir un certain format de fichiers et lui associer un ou plusieurs algorithmes de compression.

Par exemple suivant les versions, le format TIFF utilise les algorithmes de compression :

- pas de compression (jusqu'à la version 4.0 N&B)

- RLE

- LZW

- CCITT group 3 et 4

- JPEG

Les fichiers bitmap

Les fichiers peuvent être organisés sous la forme :

Si les valeurs des pixels sont codées à l'aide d'une palette on obtient :

En cas de plusieurs images présentes dans un fichier on a:

Si chaque image nécessite sa propre palette on obtient :



Pour décrire les champs on utilisera les conventions :

CHAR 8-bit signé

BYTE 8-bit non signé

WORD 16-bit non signé (entier)

DWORD 32-bit non signé (entier)

LONG 32-bit signé (entier)

FLOAT 32-bit flottant (simple précision)

DOUBLE 64-bit flottant (double précision)

GIF

= Graphics Interchange Format

créé par CompuServe Inc.

supporte jusqu'à 256 couleurs

compression LZW et c'est le seul : pas de fichier GIF non compacté, ni compacté par autre algorithme que LZW

taille maximale de l'image : 64Kbx64Kb pixels

peut contenir plusieurs images par fichier (mais souvent n'en contient qu'une)

Attention certains viewer GIF ne peuvent pas afficher plusieurs images d'un fichier GIF.

utilise le modèle RGB et les palettes

Deux révisions : GIF87a (Mai 87) et GIF89a

GIF87a


l'en tête et le descripteur logique d'écran sont de type GIFHEAD :

typedef struct _GifHeader {
   /* En tête */
   BYTE Signature[3]; /* = "GIF" */
   BYTE Version[3]; /*"87a" ou "89a" */
   /* Descripteur logique d'écran */
   WORD ScreenWidth;
/*largeur écran (en pixels) */
   WORD ScreenHeigth; /*hauteur écran (en pixels) */
   BYT
E Packed; /*info sur écran et palette globale */
  BYTE BackgroundColor; /* couleur de fond*/
  BYTE AspectRatio;
} GIFHEAD;

ScreenWidth et ScreenHeigth est la résolution minimale de l'écran pour afficher l'image correctement. Sans cela des calculs de recadrage devront être effectués.

Packed contient des informations sur la palette globale :

bit 0-2 : taille des entrées de la palette globale (i.e. nombre de bits - 1 d'une entrée)
bit 3 : = 0 (pour 89a)
bit 4-6 = 0 (pour 89a)
bit 7 : bit de présence de la table de couleur globale (= 1 => il y en une)

BackgroundColor est la couleur de fond i.e. l'aire de dessin non couverte par l'image.
AspectRatio est largeur_Pixel/hauteur_pixel.

La palette globale est optionnelle. C'est en général la seule palette du fichier. Elle est valide pour les images n'ayant pas leur propre palette.

Les entrées de cette palette sont des triplets de type :

typedef struct _GifColorTable {
BYTE Red;
BYTE Green;
BYTE Blue;
} GIFCOLORTABLE;

Le nombre d'entrées de cette palette est une puissance de 2 (au plus 256 entrées). C'est d'ailleurs :

1L << (Bit0-2dePacked + 1)

Un bloc image i est de la forme :

Le descripteur local d'image a pour type :

typedef struct _GifImageDescriptor {
   BYTE Separator; /* = 2Ch */
   WORD Left;
   WORD Top;
   WORD Width;
   WORD Height;
   BYTE Packed;
   /* Descripteur logique d'écran */
} GIFIMGDESC;

Separator indique le début du descripteur.

Left et Top indique les coordonnées du coin haut-gauche de l'image par rapport à l'écran logique.

Width et Height est la taille de l'image en pixels.

Packed contient des informations sur l'image :

bit 0 : bit de présence de la palette locale (=1 elle est présente et on l'utilise pour l'image. =0 on utilise la palette globale)
bit 1 : = 1 image entrelacée, = 0 non entrelacée.
bit 2 = 0 (pour 89a)
bit 3-4 : pour futur
bit 5-7 : nombre de bits pour chaque entrée de la palette locale

La palette locale a la même structure que la palette globale. Elle la remplace si elle est présente.

Les données images sont LZW compactées.

Elles sont stockées en suite de blocs. Le premier octet indique la taille du bloc. Le bloc est terminé par un octet NULL (redondance)

remarque : on peut décoder les blocs indépendamment les uns les autres (voire en parallèle)

Chaque pixel est un indice dans la palette associée à l'image.

Une image GIF est une suite de lignes de l'image. Chaque élément de l'image est un point.

GIF peut choisir (c'est souvent le cas) de stocker les données de manière non entrelacées (i.e. consécutivement) ou entrelacées :

- d'abord les lignes 0, 8, 16, ... (O mod 8)

- puis les lignes 4, 12, 20, ... (4 mod 8)

- puis les lignes 2, 6, 10, 14, ... (2 mod 4)

- enfin les lignes 1, 3, 5, 7, ... (1 mod 2)

=> effet de store vénitien à l'affichage mieux que consécutifs.

Gif animés

Des outils permettent de construire un gif animé en incorporant une suite d'image Gif.

Les logiciels de création de gif animés sur diverses plateformes sont à :

http://members.aol.com/royalef/toolbox.htm

Il existe des logiciels (payants) qui permettent de créer des animations par glisser-déposer et de sauvegarder le résultat dans un gif animé (ou une applet Java). Par exemple Object Dancer.

On peut citer les travaux de Yves Piguet (EPFL) à :

http://iawww.epfl.ch/Staff/Yves.Piguet/clip2gif-home/GifBuilder.html

l'outil est GifBuilder.

"GifBuilder 0.5 F est un utilitaire scriptable pour créer des GIF animés sur le

Macintosh. Il peut être utilisé manuellement pour réunir des images PICT, GIF, TIFF et/ou Photoshop ou pour convertir des films

QuickTime, FilmStrip ou PICS.

Les GIF animés peuvent être affichés par Netscape 2.0 ou plus, Microsoft Internet Explorer 2.1 ou plus. GifBuilder est freeware."

GifBuilder (Yves Piguet)

On construit les fichiers GIF (capture d'écran) et GIFConverter (shareware) par exemple.

Les images sont ajoutées par glisser-déposer.

MPEG

standard ISO pour encoder de l'audio, de la vidéo, du texte, des images dans un flot de données synchronizées.

Cette norme ISO CD 11172 est payante, peut être commandée à l'ANSI et contient 4 parties :

11172.1 Synchronization and multiplexing of audio-visual information

11172.2 Video Compression

11172.3 Audio Compression

11172.4 Conformance testing

Le groupe de travail ISO est Motion Picture Experts Group (MPEG). Le premier but est de stocker des données son et vidéo sur des CD audio et DAT. Par la suite sur des CD-ROM (mac et Windows)

MPEG, JPEG, MJPEG

MPEG n'est pas une suite d'images JPEG (!= gif animé). Une animation fait comme suite d'images MPEG dans un fichier est du MJPEG (avec en plus de la compression audio)

MPEG utilise à la fois de la compression spatiale d'images comme JPEG mais aussi de la compression temporelle (cf ci dessous)

MPEG utilise l'échelle YCbCr (variante de YUV)

La compression dans MPEG

En MPEG, compresser et plus difficile que décompresser i.e. construire des données MPEG est plus difficile que les lire.

Un flot MPEG = suite de trames

2 sortes de compression : compression "intertrame" ou temporelle et "intratrame" ou spatiale.

La compression intertrame consiste à avoir des "trames de synchronisation" et des déduire les autres trames à partir de celles là.

La compression spatiale est de compresser une trame en utilisant une compression DCT (cf. JPEG)

Compression temporelle

Il y a 3 sortes de trames en MPEG :

- trame I (trame indépendante)

- trame P (trame prédite)

- trame B (trame bidirectionelle)

Une trame I code une information vidéo indépendamment d'autres trames. Un flot MPEG commence par une trame I.

Une trame P est construite à partir de la trame P ou I la plus proche qui la précède. En fait seuls les changements ("deltas") entre cette trame et sa précédente de reférence sont codés.

Une trame B est construite à partir de 2 trames P ou I les plus proche et qui l'encadrent.

Un flot MPEG est de la forme :

IBBPBBPBBPBBIBBPBBPBBI

En pratique environ 12 trames B ou P entre 2 trames I, une trame I toutes les 0,4 secondes.

Compression spatiale

Chaque trame est ensuite compressée par l'algorithme de DCT comme le format JPEG.

Décompression

L'ordre de décompression n'est pas l'ordre des trames dans le flot. Un flot de trames :

IBBPBBPBBI (0123456789) est décompressé dans l'ordre :

IPBBPBBIBB (0312645978)

puis affiché

IBBPBBPBBI (0123456789)

Le standard MPEG n'indique la quantité de trame P et B à utiliser. Un flot MPEG constitué uniquement de trames I et un MJPEG. Il est facile à obtenir car ce sont les trames B et P qui rendent la construction d'un flot MPEG difficile. Par contre il est très peu compressé.

QuickTime

développé par Apple pour l'audio et la vidéo.

non seulemement un format mais un ensemble d'outils associés (la Movie Toolbox) permettant d'éditer, de construire des films en couper, copier, coller, ...

est utilisé sur mac ou Windows

permet de stocker des pistes multiples audio (un même film dans plusieurs langues) et des pistes multiples de vidéo (panneau interactifs du film dans plusieurs langues). Peut contenir un "preview" vidéo du film (de 5 sec), un poster.

utilise des formats de compression propriété Apple (hormis JPEG).

environ 50% de la vidéo sur le Web est en format QuickTime (New Media Magazine Septembre 1997).

D'autres produits multimédia comme Adobe After Effects, Avid Cinema, Adobe Premiere s'appuient sur QuickTime.

Bibliographie

Encyclopedia of graphics file formats James D.Murray, W. VanRyper ed 0'Reilly

FAQ

FAQ JPEG à ftp://rtfm.mit.edu:/pub/usenet/news.answers/jpeg-faq

ou e-mail à mail-server@rtfm.mit.edu avec la ligne

send usenet/news.answers/jpeg-faq

FAQ compression à ftp://rtfm.mit.edu:/pub/usenet/news.answers/compression-faq

FAQ formats de fichiers graphiques à ftp://rtfm.mit.edu:/pub/usenet/news.answers/graphics/fileformats-faq/

MPEG

A. Didier Le Gall, "MPEG: A Video Compression Standard for Multimedia

Applications," Communications of the ACM, April 1991, Vol.34, No.4, pp. 47-58

QuickTime

Inside Macintosh, Imaging and QuickTime volumes, Addison Wesley

http://www.quicktime.apple.com/

http://www.quicktimefaq.org

Gif animés

rapport d'exposé : Le format gif animé, Cédric JOUBERT, John REGNIER. valeur C Conception d'Applications Multimédia (CAM) CNAM 1997.