4 from math import acos,asin,atan,sqrt,pi,isnan
6 from outilsBase import conversion, getBit, setBit
8 from copy import deepcopy
10 from ImageChops import difference
11 from evaluation import Evaluation
13 from attaque import Attaque
19 def matrice_to_bits(matrice):
21 Renvoie la matrice des écritures binaires de matrice.
22 Les coefficients floants deviennent des chaînes (str) de bits.
29 ligne.append(conversion(str(matrice[l,c]),2))
34 def matrice_lscs(matrice,lscs):
36 Matrice est une liste de listes, lscs est une liste.
38 A partir d'une matrice de coefficients binaires, vus comme
39 des chaines de caractères, extrait les bits dont les positions
40 sont données par la liste lscs.
42 Dans la liste lscs, un entier positif signifie devant la virgule,
43 un entier négatif signifie derrière. Le premier bit devant la
44 virgule est le bit 1, le premier bit derrière la virgule est le -1.
46 Le retour est une liste de bits (entiers).
48 m,n = len(matrice), len(matrice[0])
52 #num = str(round(float(matrice[l][c]),2))
56 ent,dec = num.replace('-',''),'0'
58 ent,dec = num.replace('-','').split('.')
59 ent,dec = list(ent),list(dec)
62 if lsc > 0 and len(ent)>=lsc:
63 retour.append(ent[lsc-1])
64 elif lsc<0 and len(dec)>=abs(lsc):
65 retour.append(dec[abs(lsc)-1])
68 return [int(k) for k in retour][:-3]
71 def embarque(liste,matrice,lscs):
72 m,n = len(matrice), len(matrice[0])
77 if '-' in matrice[l][c]:
81 if '.' not in matrice[l][c]:
82 ent,dec = matrice[l][c].replace('-',''),'0'
84 ent,dec = matrice[l][c].replace('-','').split('.')
85 ent,dec = list(ent),list(dec)
87 maximum = max([abs(k) for k in lscs])
88 ent = list(''.join(ent).zfill(maximum+2))
89 dec = list(''.join(dec).zfill(maximum+2))
93 ent[lsc-1] = str(liste[cpt])
95 dec[abs(lsc)-1] = str(liste[cpt])
107 retour = [int(not L[k]) for k in range(n)]
108 retour.extend([L[k-n] for k in range(n,2*n)])
109 retour.extend([int(L[k-2*n])*int(not L[k+1]) for k in range(2*n,4*n)])
110 retour.extend([int(not L[2*n])])
117 retour = [int(not L[0])]
118 retour.extend([L[k-1] for k in range(1,len(L))])
128 rl.append(int(not el))
130 rl.append(0 if sum(x[k-2:k])%2==0 else 1 )
139 r = 0 if sum(x[i-1:i+1])%2==0 else 1
144 def coefs_rifqi(ch1,ch2):
146 assert len(ch1) == len(ch2)
147 for i,e in enumerate(ch1):
159 r = sqrt(a**2 + b**2 +c**2)
161 m = asin(float(b)/(r*sin(l)))
165 def distance_rifqi(ch1,ch2,gamma):
167 def FD(phi,gamma,phi0):
168 return float(1)/(1 + exp(float(phi-phi0)/gamma))
169 (a,b,c,_) = coefs_rifqi(ch1,ch2)
170 phi = atan(float(b+c)/(a+0.00001))
171 r = float(FD(phi,gamma,phi0)-FD(pi/2,gamma,phi0))/(FD(0,gamma,phi0)-FD(pi/2,gamma,phi0))
177 def embarque2(liste,matrice,lscs):
178 m,n = len(matrice), len(matrice[0])
179 #print m,n,liste,matrice,lscs
180 retour = deepcopy(matrice)
186 retour[l,c] = setBit(str(retour[l,c]),lsc, liste[cpt])
195 Retourne le PSNR entre deux images.
202 eqm+=(mat1[k][l] - mat2[k][l])**2
205 return 10*log(densite**2/r,10)
215 if mat1[k] != mat2[k] :
217 #print mat1[k],mat2[k]
218 return float(100*cpt)/lm
220 def arrondi_en_entier(mat):
222 return array([[round(mat[i][j]) for j in range(c)]for i in range(l)])
225 def get_initiale_image(nom_fichier):
226 initiale_image = im.open(nom_fichier+".png")
227 (taillex,tailley) = initiale_image.size
228 initiale_matrice = array(initiale_image.getdata()).reshape((taillex,tailley))
229 return initiale_matrice
232 def get_marque_matrice(nom_fichier,marque):
233 #recuperer la marque comme un vecteur de 0,1 et pas de nombres binaires
235 str_acc = "nom;"+nom_fichier
237 msg_init = [x for x in marque]
239 initiale_image = im.open(nom_fichier+".png")
240 (taillex,tailley) = initiale_image.size
241 initiale_matrice = array(initiale_image.getdata()).reshape((taillex,tailley))
243 initiale_lscs = matrice_lscs(matrice_to_bits(initiale_matrice),LSCs)
244 initiale_lscs_a_iterer = deepcopy(initiale_lscs)
247 lh = len(initiale_lscs)
251 # generation des strategies
252 ciis_p = CIIS(random(),random(),random()/2,lh-1,2*lh)._genere()
253 ciis_m = CIIS(random(),random(),random()/2,lm-1,lh)._genere()
254 cip = CIIS(random(),random(),random()/2,lm-1,lh)._genere()
256 S_c= [cip.next() for _ in xrange(nbit)]
259 for k in xrange(nbit):
265 #prour garantir Sp doit avoir au moins lm differentes valeurs
266 dates_modif_suff = sample(xrange(1,nbit),lm)
267 valeur_des_modifs=sample(xrange(lh),lm)
269 for i,e in enumerate(dates_modif_suff):
270 S_p[e]=valeur_des_modifs[i]
272 for k in xrange(nbit):
276 #pour garantir que le message est present a la fin on modifie la strategie
277 date_m=set(date_m)-set([0])
278 m = sample(date_m,lm)
279 for el in xrange(lm):
284 for k in xrange(nbit):
285 initiale_lscs_a_iterer[S_p[k]] = msg_init[S_c[k]]
286 msg_init[S_m[k]] = f(S_m[k],msg_init)
289 # Calcul du nombre de différences dans la matrice DWT
290 str_acc += ";#lscs;" + str(diff(initiale_lscs_a_iterer,initiale_lscs))
292 marquee_matrice = embarque2(initiale_lscs_a_iterer,
293 initiale_matrice,LSCs)
295 return (marquee_matrice,S_p,S_c,S_m,nbit)
299 def experience(nom_fichier):
300 marquee_matrice = marque_matrice(nom_fichier)
304 # matrices attaquees par rotation
305 attaquee_matrice = []
307 for k in range(nbexp):
308 at = Attaque.rotation(marquee_matrice,
311 attaquee_matrice += [at]
314 #print "nombre d'attaques",len(attaquee_matrice)
317 def extrait_message(S_p,S_c,S_m,x,lm,nbit):
320 #recup derniere date de modif
322 for k in xrange(nbit):
326 #suppression des iteration inutile: 0-> pair, 1-> impair
327 marque = [0 for _ in xrange(lm)]
329 for k in xrange(mini):
330 marque[S_m[k]] = f(S_m[k],marque)
331 for k in xrange(mini,nbit):
332 S[S_p[k]]= (S_c[k],marque[S_c[k]])
333 marque[S_m[k]] = f(S_m[k],marque)
335 m=[[] for _ in xrange(lm)]
345 if isnan(k) or isnan(round(k)):
361 def msg_as_img(msg,name):
362 lp = [0 if x == 0.0 else 255 for x in msg]
363 at = im.new("L",(64,64))
368 def devine_si_est_marquee(mat_prob_att,mat_ref_et_suites,seuil,lm,msg):
370 #print "mat ref...",mat_ref_et_suites
371 (_,S_p,S_c,S_m,nbit) = mat_ref_et_suites
372 x_lscs = matrice_lscs(matrice_to_bits(mat_prob_att),LSCs)
373 msgr = extrait_message(S_p,S_c,S_m,x_lscs,lm,nbit)
376 d = distance_rifqi(msg,msgr,0.1)
383 def trois_listes(l,marque):
384 noms=["../../../../BCG10/Oxford11/experiments/images/"+str(n) for n in sample(range(1,3001),l)]
385 marquees_et_suites = [get_marque_matrice(t,marque) for t in noms]
386 marquees_puis_attaquees = [Attaque.alea(m) for (m,_,_,_,_) in marquees_et_suites]
387 originales_puis_attaquees = [Attaque.alea(get_initiale_image(t)) for t in noms]
388 return (marquees_et_suites,originales_puis_attaquees,marquees_puis_attaquees)
390 def construit_paire(marquees,originales_puis_attaquees,marquees_puis_attaquees,seuil,lm,msg):
391 l = len(marquees_puis_attaquees)
392 tp = sum([devine_si_est_marquee(marquees_puis_attaquees[t],marquees[t],seuil,lm,msg) for t in range(l)])
393 fp = sum([devine_si_est_marquee(originales_puis_attaquees[t],marquees[t],seuil,lm,msg) for t in range(l)])
400 file_msg = "invader.png"
401 message = [x if x==0 else 1 for x in im.open(file_msg).getdata()]
403 (marquees,originales,attaquees) = trois_listes(20,message)
405 for t in range(1,1+nb_pts):
407 l +=[construit_paire(marquees,originales,attaquees,float(1.05)/nb_pts*t,len(message),message)]