3 #############################################
4 # Script réalisé dans le cadre du papier
5 # concernant l'utilisation de plusieurs
6 # fonctions chaotiques (pas seulement la
7 # négation vectorielle) pour le tatouage.
9 # On utilise 3 fonctions différentes, on tatoue
10 # dans le domaine ondelette.
11 #############################################
16 #from outilsBase import conversion, getBit, setBit
18 from copy import deepcopy
20 from ImageChops import difference
22 from attaque import Attaque
24 def matrice_to_bits(matrice):
26 Renvoie la matrice des écritures binaires de matrice.
27 Les coefficients floants deviennent des chaînes (str) de bits.
34 ligne.append(conversion(str(matrice[l,c]),2))
40 def matrice_lscs(matrice,lscs):
42 Matrice est une liste de listes, lscs est une liste.
44 A partir d'une matrice de coefficients binaires, vus comme
45 des chaines de caractères, extrait les bits dont les positions
46 sont données par la liste lscs.
48 Dans la liste lscs, un entier positif signifie devant la virgule,
49 un entier négatif signifie derrière. Le premier bit devant la
50 virgule est le bit 1, le premier bit derrière la virgule est le -1.
52 Le retour est une liste de bits (entiers).
54 m,n = len(matrice), len(matrice[0])
58 #num = str(round(float(matrice[l][c]),2))
62 ent,dec = num.replace('-',''),'0'
64 ent,dec = num.replace('-','').split('.')
65 ent,dec = list(ent),list(dec)
68 if lsc > 0 and len(ent)>=lsc:
69 retour.append(ent[lsc-1])
70 elif lsc<0 and len(dec)>=abs(lsc):
71 retour.append(dec[abs(lsc)-1])
74 return [int(k) for k in retour][:-3]
77 def embarque(liste,matrice,lscs):
78 m,n = len(matrice), len(matrice[0])
83 if '-' in matrice[l][c]:
87 if '.' not in matrice[l][c]:
88 ent,dec = matrice[l][c].replace('-',''),'0'
90 ent,dec = matrice[l][c].replace('-','').split('.')
91 ent,dec = list(ent),list(dec)
93 maximum = max([abs(k) for k in lscs])
94 ent = list(''.join(ent).zfill(maximum+2))
95 dec = list(''.join(dec).zfill(maximum+2))
99 ent[lsc-1] = str(liste[cpt])
101 dec[abs(lsc)-1] = str(liste[cpt])
113 retour = [int(not L[k]) for k in range(n)]
114 retour.extend([L[k-n] for k in range(n,2*n)])
115 retour.extend([int(L[k-2*n])*int(not L[k+1]) for k in range(2*n,4*n)])
116 retour.extend([int(not L[2*n])])
123 retour = [int(not L[0])]
124 retour.extend([L[k-1] for k in range(1,len(L))])
135 rl.append(int(not el))
137 rl.append(0 if sum(x[k-2:k])%2==0 else 1 )
149 r = 0 if sum(x[i-1:i+1])%2==0 else 1
159 def embarque2(liste,matrice,lscs):
161 m,n = len(matrice), len(matrice[0])
162 retour = deepcopy(matrice)
168 retour[l,c] = setBit(str(retour[l,c]),lsc, liste[cpt])
177 Retourne le PSNR entre deux images.
184 eqm+=(mat1[k][l] - mat2[k][l])**2
187 return 10*log(densite**2/r,10)
197 if mat1[k] != mat2[k] :
199 #print mat1[k],mat2[k]
200 return float(100)*cpt/lm
202 def arrondi_en_entier(mat):
204 return array([[round(mat[i][j]) for j in range(c)]for i in range(l)])
210 def experience(nom_fichier):
211 str_acc = "nom;"+nom_fichier
213 initiale_image = im.open(nom_fichier+".png")
214 (taillex,tailley) = initiale_image.size
215 initiale_matrice = array(initiale_image.getdata()).reshape((taillex,tailley))
218 hote_dct = Dct(nom_fichier+".png",idx_dct)
219 hote_dct2 = Dct(nom_fichier+".png",idx_dct)
221 initiale_dct= deepcopy(hote_dct.get_ext_dct())
224 # recup bits insignifiants
225 initiale_lscs = matrice_lscs(matrice_to_bits(initiale_dct),LSCs)
226 initiale_lscs_a_iterer = deepcopy(initiale_lscs)
229 lm = len(initiale_lscs)
231 ciis = CIIS(random(),random(),random()/2,lm-1,lm)._genere()
232 for k in range(4*lm):
235 initiale_lscs_a_iterer[strat] = int(
236 f(strat,initiale_lscs_a_iterer))
240 # Calcul du nombre de différences dans la matrice DCT
243 str_acc += ";#lscs;" + str(lm)
246 dif_iter = diff(initiale_lscs,initiale_lscs_a_iterer)
247 str_acc += ";#diff it ; " + str(dif_iter)
250 # Tatouage de la matrice")
251 marquee_ext_dct = embarque2(initiale_lscs_a_iterer,
254 # reconstruction de la matrice complete
255 hote_dct2.set_ext_dct(marquee_ext_dct)
256 marquee_matrice = hote_dct2._matrice
257 marquee_matrice = arrondi_en_entier(marquee_matrice)
260 #sauvegarde de l'image
261 (l,h)=marquee_matrice.shape
262 at = im.new("L",(l,h))
263 at.putdata(marquee_matrice.flatten())
264 at.save(nom_fichier+"_bis.png")
268 #listing = os.listdir(path_cover)
273 str_acc += ";PSNR;" + str(PSNR(initiale_matrice,marquee_matrice))
277 # matrices attaquees par rotation
278 attaquee_matrice = []
280 for k in range(nbexp):
281 at = Attaque.rotation(marquee_matrice,
284 attaquee_matrice += [at]
286 # matrices attaquees compression jpeg
288 for k in range(nbexp):
289 at = Attaque.jpeg(marquee_matrice,
292 attaquee_matrice += [at]
295 # matrices attaquees compression jp2000
296 print "compression jp2000"
297 for k in range(nbexp):
298 at = Attaque.jp2(marquee_matrice,
301 attaquee_matrice += [at]
306 # matrices attaquees decoupage
307 for k in range(nbexp):
308 t = int(0.1*(k+1)*min(taillex,tailley))
309 at = Attaque.decoupage(marquee_matrice,
312 attaquee_matrice += [at]
315 # matrices attaquees flou
316 for k in range(nbexp):
318 at = Attaque.flou(marquee_matrice,t)
319 attaquee_matrice += [at]
322 # matrices attaquees contrast
323 for k in range(nbexp):
325 at = Attaque.contraste(marquee_matrice,t)
326 attaquee_matrice += [at]
329 # matrices attaquees redimensionnement
330 print "dimensionnement"
331 attaquee_matrice += [Attaque.redimensionnement(marquee_matrice,
334 attaquee_matrice += [Attaque.redimensionnement(marquee_matrice,
341 print "nombre d'attaques",len(attaquee_matrice)
343 # evaluation des attaques
344 _,(marquee_H2,marquee_V2,marquee),(_,_,_) = \
345 pywt.wavedec2(marquee_matrice,
348 marquee_lscs = matrice_lscs(matrice_to_bits(marquee_matrice),LSCs)
351 for am in attaquee_matrice:
355 attaquee_lscs = matrice_lscs(matrice_to_bits(attaquee),LSCs)
356 d = diff(marquee_lscs,attaquee_lscs)
357 str_acc += ";" + str(d)
365 for j in sample(range(1,3001),2):
366 print experience("../images/"+str(j),3)
369 print experience("../images/"+str(3622),3)