Code de répétition
Guillaume Wisniewski
septembre 2017
Résumé
Ce TP a pour objectif de mettre en œuvre les éléments de base de la
syntaxe Java (boucles, conditions et tableaux) en prenant un exemple
d’application tiré de la théorie de l’information, le code de répétition,
et un exemple tiré du traitement d’images : la binarisation .
Vous devez être capable de faire au moins la première partie (§ 1 et
§ 2).
1 Objectif : transmission au travers d’un canal bruité
La théorie de l’information, élaborée par C. E. Shannon peu après la seconde guerre
mondiale a pour objet principale d’évaluer les performances d’un système de télécom-
munication en présence de perturbations aléatoires (désignées par le terme générique de
(cid:28) bruit (cid:29)). Elle a, depuis, été appliquée à d’autres formes de communication.
Source
• Satellite
• Ordinateur
• Mémoire vive
• cellule mère
Canal
• Onde radio
• fibre optique
• Disque dur
• DNA
Destinataire
• Terre
• Ordinateur
• Mémoire vive
• cellule fille
Figure 1 – Exemple de systèmes de transmission
Dans le paradigme de Shannon, une source engendre un message pour un destinataire.
La source et le destinataire sont reliés par un canal qui est le support de la communica-
tion. Ce canal est le siège de perturbations qui ont pour effet de créer une différence entre
le message émis et celui qui est reçu. Par exemple, dans le cas de la communication depuis
un satellite, des radiations aussi bien d’origine terrestre que cosmique (cid:28) s’ajoutent (cid:29) aux
1
informations transmises. Ces perturbations sont de nature aléatoires : il n’est pas pos-
sible, ni pour la source, ni pour le destinataire de prévoir de manière certaine leur effet.
La figure 1 décrit quelques systemes de communication correspondant a ce paradigme.
Dans le cas de la transmission d’un flux binaire (c.-à-d. d’un message constitué d’une
suite de 0 et de 1), ce phénomene peut être représenté par le modele du canal bruité :
un bit est transmis correctement avec une probabilité 1 − f et il y a une probabilité f
qu’un 0 soit transformé en 1 et un 1 en 0. Ce modèle est illustré Figure 2.
Figure 2 – Exemple de canal bruité : l’image source peut être vue comme une suite de
0 et de 1. À cause du bruit, un bit peut être (cid:28) inversé (cid:29) avec une probabilité
f lors de la transmission. L’image reçu est alors dégradée.
Un résultat fondamental de la théorie de l’information établi par Shannon en 1948 est
qu’il est possible de réaliser une transmission d’information exempte d’erreurs, malgré
l’existence de bruit de fond si l’information est représentée (codée) de manière appro-
priée : l’idée essentielle est de ne plus chercher à réduire le bruit de la communication
(par exemple en utilisant des composants de meilleure qualité) mais à introduire des
informations supplémentaires dans le signal pour arriver a détecter et a corriger les er-
reurs de transmission. La communication d’un message suit alors le principe décrit à la
Figure 3 : avant d’être transmis un message est encodé de maniere a ajouter les informa-
tions le protégeant du bruit et, au moment de la réception, les erreurs de transmissions
2
message source
message encodé
message transmis
0 0 1 0 1 1 0
000 000 111 000 111 111 000
000 000 010 000 111 101 010
Publicité
message décodé
0 0 0 0 1 1 0
Table 1 – Exemple de transmission d’un message utilisé a code a répétation. Ce code
permet de corriger 2 des 4 erreurs ayant eu lieu dans la transmission
sont corrigées par le décodeur.
source
s
encoder
t
ˆs
Décodeur
r
Canal bruité
Figure 3 – Principe de l’encodage
La manière la plus simple d’encoder un message, le code de répétition consiste tout
simplement à répéter chaque bit du message un certain nombre de fois. Par exemple,
dans le code R3 chaque bit est répété 3 fois et le message source s suivant :
s = 0 0 1 0 1 1 0
sera encodé en :
t = 0 0 0 0 0 0 1 1 1 0 0 0 1 1 1 1 1 1 0 0 0
Il est alors possible, en considérant successivement 3 bits du message reçu et en réalisant
un vote majoritaire de retrouver le message original. La table 1 donne un exemple de la
reconstruction d’un message.
2 Travail à réaliser
Vous trouverez sur le site du cours le squelette d’un programme permettant de mettre
en œuvre les principes décrits dans la section précédente. La fonction main de ce pro-
gramme va :
1. charger une image (vous pouvez utiliser l’image d’exemple donnée sur le site ou
n’importe quelle image, l’image doit être placée à la racine de votre projet) ;
2. convertir l’image en niveau de gris puis binariser celle-ci. L’image binarisée est
sauvegardée dans le fichier binary.png ;
3. convertir l’image binaire en un tableau de 0 et 1 ;
3
4. simuler la transmission de cette image binaire au travers d’un canal bruité ; le
résultat de cette transmission est stocké dans le fichier noise.png ;
5. encoder l’image, la transmettre au travers du canal bruit et la décoder ; le résultat
de cette transmission est stockée dans le fichier encoded.png ;
Vous devez réaliser les méthodes suivantes :
1 une méthode permettant de bruiter une suite de bits :
int[] addNoise(int[] data, double f)
Le parametre f doit être compris entre 0 et 1 et correspond a la probabilité qu’un
bit soit mal transmis. Cette méthode revoie un tableau binaire de même taille que
le tableau passé en paramètre. Le ie élément de ce tableau correspond soit au ie
élément de data avec une probabilité 1 − f soit à son opposé (avec une probabilité
f , cf. figure 2).
Pour déterminer si un bit doit être modifié ou non, il faut :
— définir une variable randomGenerator de la manière suivante :
Random randomGenerator = new Random();
— changer le bit si la condition randomGenerator.nextFloat() < f est vraie
2 une méthode permettant d’encoder une image selon le principe décrit § 1 :
int[] encode(int[] data)
Cette méthode renvoie un tableau dont la taille est trois fois plus grande que le
tableau passé en paramètre et qui contient chaque élément du tableau d’entrée
répété trois fois ;
3 une méthode permettant de décoder une image selon le principe décrit § 1 :
int[] decode(int[] data)
Cette méthode permet de reconstruire le signal original à partir du signal encodé.
4 une méthode permettant d’évaluer la qualité de la reconstruction
float score(int[] imageOriginale, int[] imageFinale)
Cette méthode renvoie le pourcentage de bit différents entre l’image originale et
l’image reconstruite.
5 Modifier le programme principal pour afficher la (cid:28) qualité (cid:29) du code de répétition.
3 Pour ceux qui veulent aller plus loin
3.1 Théorie de l’information
Publicité
6 On suppose que l’on cherche à transmettre un message au travers d’un canal bruité
symétrique en utilisant le codage R3. Quelle est la probabilité qu’un bit soit mal
transmis ?
7 La probabilité qu’un bit soit mal transmis dans le cadre d’un codage RN est :
N
(cid:88)
pb =
n=(N +1)/2
(cid:19)
f n (1 − f )N −n
(cid:18)N
n
4
si N est impaire. Représenter cette probabilité en fonction de N. Que peut-on en
conclure ?
3.2 Binarisation d’une image
Le programme fourni sur le site du cours propose une méthode permettant de trans-
former une image en niveaux de gris en une image binaire (dans laquelle tous les pixels
sont soit noirs, soit blancs). Nous supposerons, dans la suite, que chaque niveau de gris
est décrit par entier et qu’ils sont ordonnés de maniere croissante (c.-a-d. que la couleur
d’index 0 correspond a la couleur la plus claire et celle dont l’index est le plus grand a
la plus foncée).
La binarisation d’une image peut se réaliser simplement par seuillage des couleurs : le
pixel aux coordonées (x, y) dont la couleur est donnée par f (x, y) est transformé en une
valeur binaire par la fonction g suivante :
(cid:40)
1
0
si f (x, y) ≥ T
sinon
g(x, y) =
(1)
Dans la méthode utilisée dans la première partie de ce TP, la valeur de T est fixée, de
maniere arbitraire, a 120. Nous allons présenter une méthode permettant de déterminer
automatiquement un seuil (cid:28) optimal (cid:29) pour la binarisation des images : l’algorithme
d’Otsu.
Cette méthode est fondée sur l’analyse de l’histogramme de l’image. Cet histogramme
associe à chacun des 256 niveaux de gris possible de l’image le nombre de pixels ayant
cette couleur.
8 Écrivez une méthode int[] histogram() qui détermine l’histogramme d’une image.
Il est possible d’accéder a la couleur des pixels d’une image a l’aide du code suivant :
WritableRaster raster = img.getRaster();
int[] data = new int[img.getWidth() * img.getHeight()];
data = raster.getSamples(0, 0, img.getWidth(), img.getHeight(), 0, data);
où data est un tableau comportant autant d’éléments que l’image a de pixels,
chaque élément décrivant la couleur d’un pixel.
L’histogramme permet de déterminer p(c) la probabilité d’apparition de la ce couleur :
p(c) =
nc
n
(2)
où n est le nombre de pixels de l’image et nc le nombre de pixel de couleur c.
L’objectif est l’algorithme d’Otsu est d’utiliser l’histogramme pour répartir les différentes
couleurs dans deux groupes (on parle, techniquement, de classes) différents : l’un décrivant
l’arrière-plan de l’image et l’autre son premier plan.
La qualité d’une séparation des pixels en deux groupes par le seuil T peut être évaluée 1
par :
within(T ) = nB(T ) · σ2
σ2
B(T ) + nO · σ2
O(T )
(3)
1. Ce critère, ainsi que celui de l’équation (6) peuvent être justifiés dans un cadre statistique (cf.
l’étude des méthodes de clustering ou de partitionnement de données).
Publicité
5
où :
— nB(T ) = (cid:80)T −1
i=0 p(i) est le nombre de pixels dans la premiere classe (c.-a-d. dont
la valeur est inférieure au seuil) ;
i=T −1 p(i) est le nombre de pixels dans la seconde classe ;
— nO(T ) = (cid:80)256
— σ2
— σ2
B(T ) est la variance des pixels de la première classe ;
O(T ) est la variance des pixels de la seconde classe ;
Pour mémoire, la variance d’une classe est définie comme la distance moyenne entre
l’ensemble des points d’une classe et la moyenne de celle-ci :
σ2
C =
µC =
1
N
1
N
(cid:88)
i∈C
N
(cid:88)
i∈C
(µ − p(i))2
p(i)
(4)
(5)
où C est l’ensemble des N points d’une classe.
Intuitivement, le critère décrit dans l’équation (3) est d’autant plus petit que les points
d’une classe sont proches de la moyenne de celle-ci et par conséquent que la séparation
entre les deux classes soient grandes.
Une fois ce critère défini, il suffit, pour chaque valeur possible de T de calculer la
qualité de la binarisation induite par ce seuil et de chercher le seuil de meilleur qualité
(c.-à-d. minimiser σ2
within(T )).
9 Implémenter la méthode permettant de trouver la valeur optimale de T selon le
critère d’Otsu.
La complexité (nombre d’opérations/calculs) de la méthode précédente peut-être for-
tement réduite en observant que minimiser σ2
within revient à maximiser :
between(T ) = σ2 − σ2
σ2
within(T )
= nB(T ) · nO(T ) (µB(T ) − µO(T ))2
(6)
(7)
10 Montrer que :
nB(T + 1) = nB(T ) + nT
nO(T + 1) = nO(T ) − nT
µB(T + 1) =
µO(T + 1) =
µB(T ) · nB(T ) + nT · T
nB(T + 1)
µO(T ) · nO(T ) − nT · T
nO(T + 1)
11 Modifier la méthode précédente pour calculer plus efficacement la qualité du par-
titionnement.
6