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 #############################################
14 from math import acos,asin,atan,sqrt,pi,isnan
15 from outilsBase import conversion, getBit, setBit,matrice_lscs,matrice_to_bits, LSCs,embarque2,ci2_watermark,ITFACTOR,f
17 from copy import deepcopy
19 from ImageChops import difference
20 from evaluation import Evaluation
22 from attaque import Attaque
23 from Levenshtein import distance
27 def sauve_img_msg(mat,k):
28 lp = [0 if x == 0.0 else 255 for x in mat]
29 at = im.new("L",(64,64))
31 at.save("msg_"+str(k)+".png")
42 Retourne le PSNR entre deux images.
49 eqm+=(mat1[k][l] - mat2[k][l])**2
52 return 10*log(densite**2/r,10)
62 if mat1[k] != mat2[k] :
64 #print mat1[k],mat2[k]
65 return float(100)*cpt/lm
67 def arrondi_en_entier(mat):
69 return array([[round(mat[i][j]) for j in xrange(c)]for i in xrange(l)])
73 def occurrences(s, lst):
74 return [i for i,e in enumerate(lst) if e == s]
77 def coefs_rifqi(ch1,ch2):
79 assert len(ch1) == len(ch2)
80 for i,e in enumerate(ch1):
92 r = sqrt(a**2 + b**2 +c**2)
94 m = asin(float(b)/(r*sin(l)))
98 def distance_rifqi(ch1,ch2,gamma):
100 def FD(phi,gamma,phi0):
101 return float(1)/(1 + exp(float(phi-phi0)/gamma))
102 (a,b,c,_) = coefs_rifqi(ch1,ch2)
103 phi = atan(float(b+c)/(a+0.00001))
104 r = float(FD(phi,gamma,phi0)-FD(pi/2,gamma,phi0))/(FD(0,gamma,phi0)-FD(pi/2,gamma,phi0))
109 def extrait_message(S_p,S_c,S_m,x,lm):
112 nbit = int(ITFACTOR * lh)
113 #recup derniere date de modif
115 for k in xrange(nbit):
119 #suppression des iteration inutile: 0-> pair, 1-> impair
120 marque = [0 for _ in xrange(lm)]
122 for k in xrange(mini):
123 marque[S_m[k]] = f(S_m[k],marque)
124 for k in xrange(mini,nbit):
125 S[S_p[k]]= (S_c[k],marque[S_c[k]])
126 marque[S_m[k]] = f(S_m[k],marque)
128 m=[[] for _ in xrange(lm)]
138 if isnan(k) or isnan(round(k)):
153 def experience(nom_fichier,marque):
154 str_acc = "nom;"+nom_fichier
156 initiale_image = im.open(nom_fichier+".png")
157 (taillex,tailley) = initiale_image.size
158 initiale_matrice = array(initiale_image.getdata()).reshape((taillex,tailley))
160 (marquee_matrice,S_p,S_c,S_m) = ci2_watermark(initiale_matrice,marque)
161 #sauvegarde de l'image
162 (l,h)=marquee_matrice.shape
166 # Calcul du nombre de différences dans la matrice
167 #str_acc += ";#lscs;" + str(diff(initiale_lscs_a_iterer,initiale_lscs))
169 str_acc += ";PSNR;" + str(PSNR(initiale_matrice,marquee_matrice))
173 attaquee_matrice = []
176 # matrices attaquees par rotation
178 for k in xrange(nbexp):
179 at = Attaque.rotation(marquee_matrice,
182 attaquee_matrice += [at]
184 # matrices attaquees compression jpeg
186 for k in xrange(nbexp):
187 at = Attaque.jpeg(marquee_matrice,
190 attaquee_matrice += [at]
194 # matrices attaquees compression jp2000
195 #print "compression jp2000"
196 for k in xrange(nbexp):
197 at = Attaque.jp2(marquee_matrice,
200 attaquee_matrice += [at]
205 # matrices attaquees decoupage
206 for k in xrange(nbexp):
207 t = int(0.05*(k+1)*min(taillex,tailley))
208 at = Attaque.decoupage(marquee_matrice,
211 attaquee_matrice += [at]
214 # matrices attaquees flou
215 for k in xrange(nbexp):
217 at = Attaque.flou(marquee_matrice,t)
218 attaquee_matrice += [at]
222 # matrices attaquees contrast
223 for k in xrange(nbexp):
225 at = Attaque.contraste(marquee_matrice,t)
226 attaquee_matrice += [at]
229 # matrices attaquees redimensionnement
230 #print "dimensionnement"
231 for k in xrange(nbexp):
233 attaquee_matrice += [Attaque.redimensionnement(marquee_matrice,
240 # matrices attaquees contrast
241 for k in xrange(nbexp):
243 at = Attaque.changeLSC(marquee_matrice,t)
244 attaquee_matrice += [at]
247 # matrices attaquees en appliquant à nouveau l'algo
249 for k in xrange(nbexp):
250 it2 = ITFACTOR*30*(k+1)/nbexp
251 mp= [randint(0,1) for _ in xrange(lm)]
252 attaquee_matrice += [Attaque.ci2_watermark_again(marquee_matrice,
255 #print "nombre d'attaques",len(attaquee_matrice)
257 # evaluation des attaques
259 for am in attaquee_matrice:
262 attaquee_lscs = matrice_lscs(matrice_to_bits(am))
263 msg = extrait_message(S_p,S_c,S_m,attaquee_lscs,lm)
264 #d = diff(msg,msg_init)
267 #d= round(float(distance("".join([str(x) for x in msg]),"".join([str(x) for x in msg_init])))/len(msg),2)
268 d = round(distance_rifqi(msg,marque,0.1),2)
270 str_acc += ";" + str(d)
280 file_msg = "invader.png"
281 message = [x if x==0 else 1 for x in im.open(file_msg).getdata()]
282 print "taille du message =", len(message)
286 for j in sample(xrange(1,3001),2):
287 print experience("../../../../BCG10/Oxford11/experiments/images/"+str(j),message)
293 print experience("../../../../BCG10/Oxford11/experiments/images/2838", message)
295 print experience("../../../../BCG10/Oxford11/experiments/images/350",message)
296 #lscs;49.1746808016;PSNR;51.2134378146;0.62;0.65;0.63;0.97;0.98;0.97;0.97;0.98;0.98;0.99;0.98;0.99;0.99;0.99;0.99;0.99;0.99;0.99;0.99;0.0;0.0;0.0;0.0;0.0;0.0;0.0;0.0;0.0;0.0;0.0;0.0;0.0;0.0;0.0;0.0;0.0;0.0;0.0;0.0;0.0
297 print experience("../../../../BCG10/Oxford11/experiments/images/2812",message)
298 #lscs;49.1865064984;PSNR;51.2123935338;0.01;0.01;0.01;0.01;0.03;0.01;0.01;0.02;0.01;0.23;0.02;0.03;0.04;0.05;0.14;0.11;0.15;0.2;0.22;0.0;0.0;0.0;0.0;0.0;0.0;