• Aucun résultat trouvé

La réduction du nombre de couleurs d’une image couleur est un problème de quantification. La solution optimale pour extraire les K couleurs est obtenue en résolvant :

{Pi,k, C(k)} = arg min

{Pi,k,C(k)} N X i=1 K X k=1

Pi,k.dist2(I(i), C(k)), (9.1)

and∀i, ∃!k0, [Pi,k0 = 1 and∀k 6= k0, Pi,k = 0] ,

où I est une image couleur de dimension N pixels, C(k) est la k-ième couleur parmi les K couleurs recherchées, dist est une fonction de distance dans l’espace couleur (L2 dans l’espace couleur RGB) et Pi,k ∈ {0, 1} est la valeur d’appartenance du pixel i à la couleur k.

Une solution bien connue pour minimiser l’équation (9.1) et ensuite obtenir les K couleurs, est d’utiliser l’algorithme ISODATA des k-moyens [Ball et al. 66]. Pi,k est définie telle que :

∀i, ∀k, Pi,k = ( 1si k = arg k0 {k0∈{1,...,K}min dist(I(i), C(k 0))}, 0sinon, avec C(k) = PNi=1Pi,k×I(i)

PN

Dans notre approche le nombre K est significatif (K = 512). Si nous utilisons l’algorithme classique des k-moyens, le nombre de couleurs extrait sera souvent en dessous de K. C’est le problème bien connu de « classes mortes ». De plus, l’algorithme des k-moyens est assez long en temps processeur par rapport aux approches non optimales mais rapides telles que la quantification couleur par octree de Gervautz et Purgathofer [Gervautz et al. 90], l’approche par coupe médiane de [Heckbert 82] etc. Pour pallier ces deux problèmes (« classes mortes » et complexité calcula- toire), nous utilisons l’algorithme de quantification couleur par octree comme une initialisation à l’algorithme des k-moyens. Les valeurs de Pi,k sont initialisés à partir du résultat obtenu avec

l’algorithme de quantification couleur par octree.

9.2.2 L’algorithme de parcours en couches

Une fois que la quantification couleur a été traitée, l’image à K couleurs obtenue peut être représentée par une image d’index (valeurs des Pi,k) et une palette de couleurs (valeurs C(k)).

L’image d’index est notée Index et définie par :

∀i ∈ {1, ..., N}, Index(i) = arg max

k∈{1,...,K}Pi,k.

Notre but est alors de résoudre deux contraintes ; la première contrainte est d’obtenir une image d’index où chaque niveau de gris est proche de la luminance de l’image couleur originale ; la deuxième contrainte consiste à obtenir une palette de couleurs dont les couleurs consécutives sont peu éloignées. Grâce à la quantification couleur, nous possédons déjà une image d’index et une palette de couleurs. Notre problème consiste alors à trouver une fonction de permutation qui permutent simultanément les valeurs de l’image d’index et les valeurs de la palette de couleurs. La fonction de permutation Φ est trouvée en résolvant l’équation :

Φ = arg min

Φ N

X

i=1

dist2(Y(i), Φ(Index(i))) + λ

KX−1 k=1

dist2(C(Φ−1(k)), C(Φ−1(k + 1))), (9.2)

où Y est la luminance de l’image couleur originale et λ est la valeur du Lagrangien. La fonction de permutation Φ est une fonction bijective dans N et définie telle que Φ : {1, ..., K} → {1, ..., K}.

Nous approchons l’optimum de l’équation (9.2) en utilisant un algorithme heuristique : l’al- gorithme de parcours en couches [Chaumont et al. 07b]. Le but de cet algorithme est de trouver un ordonnancement pour les K couleurs tel que les couleurs consécutives soient peu éloignées et tel que la luminance des couleurs soient ordonnées des plus sombres aux plus claires. Cet ordon- nancement définit pour chaque k-ième couleur une position k0 qui nous donne la fonction Φ telle

que Φ(k) = k0.

Pour trouver un ordonnancement des K couleurs, l’algorithme parcourt l’espace des couleurs pour construire la suite ordonnée de couleurs. La figure 9.2 illustre le chemin obtenu après un parcours dans le cube RGB. Ce parcours est effectué en « sautant » de couleur en couleur, dans l’espace couleur, en choisissant la couleur la plus proche de la couleur courante. La première couleur de cette suite est choisie comme étant la couleur la plus sombre parmi les K couleurs. Une contrainte supplémentaire à ce parcours consiste à limiter la recherche de couleur aux couleurs peu éloignées en luminance. Cela signifie que le parcours dans l’espace des couleurs est limité à une fenêtre définie sur les informations de luminance. Cet algorithme de parcours en couches peut être vu comme une sorte « de parcours 3D en spirale » dans l’espace des couleurs.

FIGURE9.2 – Vue du parcours en couches dans le cube RGB.

Cet algorithme de parcours en couches possède un paramètre caché qui est la taille de la couche utilisée lors du parcours dans l’espace couleur. Notre but étant de minimiser l’équation 9.2, une manière satisfaisante pour régler automatiquement ce paramètre est de tester toutes les valeurs possibles de taille de couche et de garder la taille de couche minimisant l’équation 9.2. Sachant que les valeurs possibles de taille de couche appartiennent à {1, ..., K} et qu’il est très rapide de faire un parcours dans l’espace couleur, cette approche donne une solution élégante et rapide pour approximer l’équation 9.2.

Finalement, le paramètre λ de l’équation 9.2 est fixé à λ = α × N/(3 × (K − 1)), avec α la valeur permettant de régler le compromis entre une image d’index proche de l’image de luminance, ou une palette de couleurs dont les couleurs sont proches deux à deux (voir équation 9.2). Par exemple, lorsque α est fixé à 1 la même importance est donnée aux deux contraintes, lorsque α est fixé à 0, 5 cela signifie une image d’index plus proche de l’image de luminance, a contrario lorsque α est fixé à 2 cela implique une palette de couleurs plus continue.

Une fois que l’image d’index et la palette de couleurs ont été calculées et réorganisées, on effectue la dissimulation de données. La section suivante explique quel est le message à insérer, comment le mettre en forme et comment fonctionne l’algorithme de tatouage réversible.

9.2.3 Construction du message

Une fois que la décomposition de l’image couleur (en 512 couleurs) et son réarrangement (algorithme de parcours en couches) ont été effectués, un des plans de bits de l’image d’index est supprimé afin de créer une image de couverture codée sur 8 bits. Le plan de bits supprimé et la palette de couleurs sont ensuite compressés pour être insérés dans l’image de couverture (voir figure 9.1).

(codage différentiel + codage arithmétique) de chaque couleur appartenant à la palette de couleurs. Pour comprimer le plan de bits, il est également nécessaire de passer par un codage d’erreur de prédiction afin d’obtenir un taux de compression élevé. Pour cela, le vecteur noté b représentant le plan de bits est transformé en un vecteur d’erreur de prédiction, noté e, tel que e ∈ {−1, 0, 1}N

avec N la taille de l’image, puis ce vecteur est codé par un codage entropique. Pour obtenir e, nous procédons en deux étapes.

À la première étape, pour chaque pixel Index(i) (codé sur 9 bits) à la position i, nous calculons la prédiction P redpixel(i):

P redpixel(i) =



C si|A − B| < |A − C|

B sinon, (9.3)

avec A, B et C les pixels voisins du pixel courant Index(i) tel que : ligne précédente A B

ligne suivante C Index(i)

Ce type de prédiction est utilisé dans l’approche « Differential Pulse Code Modulation » (DPCM). Cette technique prend essentiellement en compte les contours d’objets afin d’avoir une prédiction plus efficace qu’une simple moyenne locale. La prédiction est suffisamment efficace pour notre approche. Notons que les prédictions au bord de l’image sont calculées avec les valeurs dispo- nibles.

La deuxième étape consiste à trouver pour chaque position i la meilleure prédiction du bit b(i)(provenant d’un des plans de l’image Index). Que cela soit du côté du codeur ou du côté du décodeur, pour cette position i, les informations des autres plans de bit sont connues. On a donc deux prédictions possibles sachant les autres plans : ou bien prédire un 0 ou bien un 1. Sachant que l’on a la valeur de P redpixel(i), on doit décider quelle est l’hypothèse la plus probable entre

avoir le bit b(i) à 0 (dans ce cas, la valeur du pixel est notée Index0(i) ∈ {0, ..., 511}) ou avoir

le bit b(i) à 1 (dans ce cas, la valeur du pixel est notée Index1(i) ∈ {0, ..., 511}). L’hypothèse

la plus probable (qui sera utilisée comme valeur de prédiction) est choisie en fonction du maxi- mum entre les deux probabilités prob(P redpixel(i)|Index0(i))et prob(P redpixel(i)|Index1(i)).

Il s’agit d’un classique test à deux hypothèses et en supposant que les distributions de probabilité sont gaussiennes le meilleur choix est le suivant :

P redbit(i) =



0 si (P redpixel(i)− Index0(i))2< (P redpixel(i)− Index1(i))2

1 sinon. (9.4)

Pour finir, le vecteur d’erreur de prédiction e est calculé (les valeurs d’erreur sont soit -1, 0 ou 1) :

e(i) = b(i)− P redbit(i). (9.5)

Le vecteur d’erreur de prédiction e peut maintenant être codé et en raison du bon comporte- ment de la prédiction, l’entropie est plus faible et le coût de codage petit.