Uncle Den's Uncle Den's

Image cachée dans une autre image

On désire cacher l'image de la tour Effel dans l'image des oiseaux (ces images ont exactement les mêmes dimensions)
 
Tour Eiffel
oiseaux

Chaque pixel contient 3 octets de couleur rouge-vert et bleu, chacun codé de 0 à 255. En hexadécimal, allant de 00 à FF:
hexadecimal
L'astuce est de garder les bits forts de chaque octet de couleur pour l'image qui va masquer l'image qu'on va masquer Exemple, si la valeur décimale est 180, la valeur hexa est B4, on retient les bits forts;: B, soit B0.

Du côté de l'image à masquer, également les bits forts, qu'on ajoute du côté des bits faibles dans l'image codée.
Exemple: si la valeur décimale est 172, la valeur hexa est AC, on retient les bits forts A, c'est à dire 0A.

Le codage de l'octet de l'image codée sera B0 + 0A, c'est à dire BA.

Cela revient à ajouter les 2 images suivantes ensemble:

Images avant transformation

oiseaux Tour Eiffel

Images transformées avant combinaison

oiseau2
tour eiffel 2

Fusion des 2 images transformées

oiseaux

Pour retrouver l'image cachée, il suffit de ne prendre que les bits de poids faible de l'image codée, et de les placer du côté des bits de poids forts.
En reprenant l'exemple ci-dessus, cela revient à ne récupérer que le A de l'octet BA, pour le mettre du côté des bits de poids forts, c’est-à-dire A0==160 (au lieu de AC==172)

Le résultat est celui-ci:
Tour eiffel
Image originale
Tour Eiffel
 

Combinaison des images:

Décodage de l'image:

from PIL.Image import *

g1=open("image01.jpg") #image encore visible
g2=open("image02.jpg") #image cachée
(xmax,ymax)=g1.size

im=new('RGB',(xmax,ymax),(255,255,255))

for j in range(ymax):
    for i in range(xmax):
        c1=Image.getpixel(g1,(i,j))
        c2=Image.getpixel(g2,(i,j))
        r=16*int(c1[0]/16)+int(c2[0]/16)
        v=16*int(c1[1]/16)+int(c2[1]/16)
        b=16*int(c1[2]/16)+int(c2[2]/16)
        Image.putpixel(im, (i,j), (r,v,b))
                                  
im.save("ima_cache02.bmp","BMP")
from PIL.Image import *

g1=open("ima_cache03.bmp") #image codee
(xmax,ymax)=g1.size

im=new('RGB',(xmax,ymax),(255,255,255))

for j in range(ymax):
    for i in range(xmax):
        c1=Image.getpixel(g1,(i,j))
        r=16*(c1[0]%16)
        v=16*(c1[1]%16)
        b=16*(c1[2]%16)
        Image.putpixel(im, (i,j), (r,v,b))
                                  
im.save("ima_decache01.bmp","BMP")

Remarque: la méthode étant sensible aux bits de faibles poids, il ne faut pas utiliser des formats d'images compressées tels que JPG, mais garder le format de type BMP.


<< retour accueil cryptographie et Python