Essai de stéganographie avec Octave

Cacher une image dans une autre

Nous allons essayer de cacher une image en noir et blanc dans une image traditionnelle (codée sur 24 bits). Les deux images ont la même dimension.

L'image visible est appelée "hibou.png", l'image à cacher s'appelle "crypto.png"


La création d'une image couverture

L'image du hibou est codée sur 24 bits, cela signifie que chaque pixel est représenté par trois nombres compris entre 0 et 255, le premier donnant la composante rouge, le deuxième la verte et le troisième la bleue. Nous allons modifier légèrement la matrice du rouge, c'est-à-dire la première des trois matrices associées à l'image.

L'image à cacher est représentée simplement par des 0 pour le noir et des 255 pour le blanc (dans le cas où les couleurs ne sont pas indexées ). En divisant tout par 255, on obtient une matrice faite de 0 et de 1.

Commençons par afficher les matrices des images

A=imread("hibou.png")
 B=A(:,:,1)
 E=imread("crypto.png")/255
 F=E(:,:,1)

B est la première des trois matrices qui décrivent l'image du hibou; F est la première matrice qui décrit l'image à cacher (les deux autres lui sont égales…)

l'idée maintenant est de jouer sur la parité : dans la matrice B, on va garder les nombres pairs et diminuer d'une unité les nombres impairs.De cette façon, la matrice C obtenue ne contiendra que des nombres pairs. Puis l'on ajoute C et E. Finalement toute l'information sur l'image cachée est contenue dans la parité des termes de la matrice G=C+E…

B=double(B)
 C=2*floor(B/2)
 G=C+E

double permet de travailler en décimal (à vérifier)

Voici les blocs de matrice correspondant au coin supérieur gauches des images

La matrice B


La matrice C


La matrice F    qui représente


La matrice G

Il reste à créer l'image qui recèle des informations cachées

imwrite("couverture.png",G,A(:,:,2),A(:,:,3))

On a remplacé la première matrice A(:,:,1) par G. et on obtient cette image…Vous voyez une différence ?


Vous pouvez envoyer l'image à votre contact…

Décoder l'image

Le contact a bien reçu l'image et il veut afficher les informations cachées…

On va afficher des 0 pour les nombres pairs et des 1 pour les nombres impairs de la première matrice.

M=imread("couverture.png")
	 N=M(:,:,1)
	 N=double(N)
	 P=mod(N,2)

Il ne reste plus qu'à afficher la matrice P

imwrite("resultat.png",P)

Ici P est une matrice simple de 0 et de 1 ; on aurait pu multiplier cette matrice par 255 et former une triple matrice formeées de trois matrices identiques, ce qui aurait donné notre image de départ. Il semble qu'à partir d'une matrice de 0 et de 1, Octave crée directement une image en noir et blanc.


Remarque: en convertissant crypto.png en niveaux de gris avec Gimp , on aurait eu une seule matrice au lieu de trois. En revanche, en la convertissant en image indexée sur 1 bit (donc noir et blanc), on obtient une matrice formée de 0 et de 1 mais elle ne me donne pas tout à fait le résultat escompté: le docteur House est comprimé en largeur…

La prochaine étape sera de cacher une image de meilleure qualité…

fait le 2 août 2008