Compression

TODO: Introduction, On va faire de la compression d’image. Expliquer ce qu’est l’entropie…

Les outils et formats de compression sont disponible ici, et le code utilisé pour générer les images et animation de cet article sont disponible ici.

Table des matières
Espace couleurs
Quantification
Courbe de remplissage
Codage différentiel
Compression sans perte

Espace couleurs

Table des matières
RGB
CMY
YCoCg
xRGxB

RGB

TODO: Explication de pourquoi c’est RGB le standard, donc la synthèse additive

rgb-r rgb-g rgb-b

CMY

TODO: Synthèse soustractive

R = 255 - C
G = 255 - M
B = 255 - Y

rgb-c rgb-m rgb-y

YCoCg

TODO: Formules de conversion depuis et vers RGB

TODO: GIF pour visualiser l’espace de couleur

xRGxB

Le xRGxB est l’espace de couleur utilisé dans dbimg. Il a été conçu pour avoir une traduction très rapide depuis et vers RGB, utilisant simplement deux ou exclusifs:

R  = xR ^ G
G  = G
B  = xB ^ B

xrgxb-r xrgxb-g xrgxb-b

Quantification

TODO: Distance dans l’espace de couleur, dithering…

Courbe de remplissage

TODO: Explication de comment on utilise les courbes de remplissage dans la compression image, qu’est ce qu’on recherche comme propriété de courbe et comment c’est utile pour la compression d’image

Dans une image, les couleurs sont rarement réparties aléatoirement. Généralement, des points proche dans l’image vont tendance a avoir une couleur similaire. Pour exploiter cette redondance, on va chercher a utiliser des courbes de remplissage. Ici, on appelle courbe de remplissage une fonction bijective entre un espace a deux dimensions et un espace a une seule dimension.

Table des matières
Trame
Serpent
Courbe de Peano
Courbe de Hilbert
Courbe de Lebesgue

Trame

La trame est la courbe de remplissage la plus simple a implémenter. L’espace est parcouru de haut en bas, de gauche a droite.

L’indice dans la courbe peut être obtenu pour un point (x, y) et une largeur d’image LARGEUR fixée avec la formule suivante:

E(x, y) = y * LARGEUR + x
D(i) = (i / LARGEUR, i % LARGEUR)

standard

Un des avantage principale de cette méthode est sa simplicité. Un des inconvénient principal est qu’elle n’est pas continue, et que deux points (x₁, y₁) et (x₂, y₂) qui sont proche dans l’espace a deux dimensions peuvent se retrouver loin dans la courbe finale.

TODO: Calculer distance moyenne / maximum dans la courbe?

TODO: Preuve de bijectivité?

Serpent

La courbe en serpent est une amélioration simple de la courbe en trame, qui vise simplement a réparer le soucis de continuité de cette dernière. Comme son nom l’indique, elle va serpenter l’espace: en allant de haut en bas mais en alternant de gauche a droite et de droite a gauche. Son implémentation est la suivante:

E(x, y) =
  si y est paire:
    y * LARGEUR + x
  si y est impaire:
    y * LARGEUR + (LARGEUR - 1 - x)

TODO: Fonction de décodage

serpent

TODO: Avantage de cette méthode (La courbe est continue)

TODO: Inconvéniants de cette méthode (On inverse la logique pour les répétitions)

TODO: Calculer distance moyenne / maximum dans la courbe?

TODO: Preuve de bijectivité?

Courbe de Peano

TODO: Comment ça marche?

TODO: Avantage de cette méthode (La courbe est continue)

TODO: Gif pour visualiser

TODO: Avantage de cette méthode

TODO: Inconvéniants de cette méthode

TODO: Calculer distance moyenne / maximum dans la courbe?

TODO: Preuve de bijectivité?

Courbe de Hilbert

TODO: Comment ça marche?

hilbert

TODO: Avantage de cette méthode

TODO: Inconvéniants de cette méthode

TODO: Calculer distance moyenne / maximum dans la courbe?

TODO: Preuve de bijectivité?

Courbe de Lebesgue

TODO: Comment ça marche?

TODO: Avantage de cette méthode

TODO: Gif pour visualiser

TODO: Avantage de cette méthode

TODO: Inconvéniants de cette méthode

TODO: Calculer distance moyenne / maximum dans la courbe?

TODO: Preuve de bijectivité?

Codage différentiel

TODO: Différents encodages différentiels, on utilise un opérateur avec certaines propriété et hop

E(0) = D(0)
E(n + 1) = D(n + 1) ⨂ D(n)

TODO: Visualisation des différents encodages différentiels d’une image source avant et après pour chaque channel? Découpé par channel et combiné? Mais quelle courbe de remplissage utiliser?

TODO: Comment introduire de la perte dans le codage différentiel (Masque, …)

Compression sans perte

Table des matières
Codage par plages
Lempel-Ziv

Codage par Plages

Le codage par plages, (en anglais Run-Length Encoding ou RLE), est un des algorithme de compression sans perte les plus simple. Il consiste a remplacer des répétitions de valeurs identique par une paire indiquant la valeur et le nombre de fois ou cette valeur doit être copiée.

TODO: GIF pour visualiser

TODO: Implémentation concrètes possibles de RLE

Lempel-Ziv

Lempel-Ziv est une généralisation du codage par plage.

TODO: Explication de Lempel-Ziv

TODO: GIF pour visualiser

TODO: Implémentation concrète possible de Lempel-Ziv