Camouflage d'un texte dans une image

Importation de l'image

image  =  
        Import["interne:Sites:LCP:cours:dm:Cryptologie:codage:images:\
perroquet.tif", "TIFF"];

Remarque: Il faut changer le chemin d'accès de l'image. On peut obtenir le chemin d'accès au fichier image en allant dans le menu "Input > Get File Path..."

Show[image];

original = image[[1, 1]];
hauteur = Dimensions[
            original][[1]];
largeur = Dimensions[original][[2]];

Camouflage

extrait = "Le lion, terreur des forêts, 
Chargé d'ans et pleurant son antique prouesse, 
Fut enfin attaqué par ses propres sujets, 
Devenus forts par sa faiblesse.
Le cheval s'approchant lui donne un coup de pied; 
Le loup, un coup de dent; le boeuf, un coup de corne. 
Le malheureux lion, languissant, triste, et morne, 
Peut à peine rugir, par l'âge estropié.
Il attend son destin, sans faire aucunes plaintes, 
Quand voyant l'âne même à son antre accourir:
«Ah! c'est trop, lui dit-il; je voulais bien mourir; 
Mais c'est mourir deux fois que souffrir tes atteintes.»";

On supprime tous les caractères spéciaux:

ascii = ToCharacterCode[extrait];

Codage en base 2 sur un octet:

extraitCodé = IntegerDigits[ascii, 2, 8];

On enlève toutes les accolades intérieures:

flotExtraitCodé = Flatten[extraitCodé];

On compte le nombre de bits qu'il nous faudra pour camoufler le message:

nbrBits = Length[flotExtraitCodé]

Découper une partie de l'image

On enlève toutes les accolades intérieures:

originalPlat = Flatten[original];

On vérifie qu'il n'y a pas de valeurs 255. Si c'est le cas, on les remplace par 254.

Partie à programmer

On prend les "nbrBits" premiers bits:

débutOriginal = Take[originalPlat, nbrBits];

Camoufler le texte dans la partie de l'image découpée

On convertit le nombres ci-dessus en pair (0) ou impair (1):

débutMod2 = Mod[débutOriginal, 2];

On fait ensuite un XOR avec l'extrait codé:

diff = Abs[flotExtraitCodé - débutMod2];

coeff = 1;

On additionne maintenant la liste "diff" avec le début de l'image originale. "Coeff" sert à rendre visible les changements dans un but didactique. Mettez 50 pour voir les changements, et 1 pour le fonctionnement normal.

débutChiffré = 
        débutOriginal + coeff*diff;

On remplace de début de l'image originale avec l'image contenant le message:

Partie à programmer

On remet les accolades intérieures:

Partie à programmer

Voici la nouvelle image dans laquelle on a intégré le texte:

imageModifiée = 
        Graphics[
          Raster[nouvelleImage, {{0, 0}, {largeur, hauteur}}, {0, 255}, 
            ColorFunction -> RGBColor], {AspectRatio -> Automatic, 
            ImageSize -> {largeur, hauteur}}];
Show[imageModifiée];

que l'on peut comparer avec l'original:

Show[image];

Exportation de l'image

Export["perroquet2.tif", 
      imageModifiée, "TIFF"]