5 import PythonMagick as pm
8 from ConfigParser import ConfigParser
10 from outilsBase import *
11 #from script_spatial import ci2_watermark
20 at = Im.new("L",(l,h))
21 at.putdata(mat.flatten())
27 return np.array(at.getdata()).reshape((l,h))
31 def rotation(mat,angle, nombre=1):
34 (l,h,at) = Attaque._commun_in(mat)
35 carreNoir=Im.new('L',(l*3,h*3),color=1)
36 for k in xrange(nombre):
37 (posx,posy) = (int(float(1.5*l)/2),int(float(1.5*h)/2))
38 carreNoir.paste(at,(l,h))
39 tourne = carreNoir.rotate(angleb)
40 carreNoir = tourne.rotate(-angleb)
41 carreNoir = carreNoir.crop((l+1,h+1,2*l+1,2*h+1))
42 atq = Attaque._commun_out(carreNoir)
43 #carreNoir.save("rot"+str(angle)+".bmp")
50 def ci2_watermark_again(mat,marque,ni):
51 (atq,_,_,_) = ci2_watermark(mat,marque,ni)
56 def jpeg(mat,nom_temp,taux = 100):
57 '''Attaque par compression jpeg :
58 - taux = 100 : image d'origine,
59 - taux 75 : compression par défaut,
60 - taux = 1 : le plus fort taux de compression.'''
61 (l,h,at) = Attaque._commun_in(mat)
62 ch = nom_temp+'_'+str(taux)+'.jpg'
63 #TODO : utiliser le module de fichier temporaire de python
64 at.save(ch,quality = taux)
67 return Attaque._commun_out(at)
71 def jp2(mat,nom_temp,taux = 100):
72 '''Attaque par compression jpeg :
73 - taux = 100 : image d'origine,
74 - taux 75 : compression par défaut,
75 - taux = 1 : le plus fort taux de compression.'''
76 (l,h,at) = Attaque._commun_in(mat)
78 img_2_nm = "img_"+str(taux)+"_.jp2"
80 st = "convert img.bmp -define jp2:rate="+\
81 str(taux/float(100))+" "+img_2_nm
84 system("convert "+img_2_nm+" img_2.png")
85 atb = Im.open("img_2.png")
86 system("rm " + "img_"+str(taux)+"_.jp2")
87 system('rm img_2.png')
89 return Attaque._commun_out(atb)
93 def decoupage(mat, taille = 50, position = (0,0)):
95 Attaque par découpage de l'image.
97 (_,_,at) = Attaque._commun_in(mat)
99 carreNoir=Im.new('L',(taille,taille))
100 carreNoir.putdata([0 for _ in xrange(taille**2)])
101 at.paste(carreNoir,position)
102 return Attaque._commun_out(at)
106 def changeLSC_wave(mat,taux):
108 (taillex,tailley) = mat.shape
109 A2,(mat_H2,mat_V2,mat_D2),(H1,V1,D1) = pywt.wavedec2(mat,
112 mat_D2_lscs = matrice_lscs(matrice_to_bits(mat_D2),LSCs)
113 mat_H2_lscs = matrice_lscs(matrice_to_bits(mat_H2),LSCs)
114 mat_V2_lscs = matrice_lscs(matrice_to_bits(mat_V2),LSCs)
116 l = [mat_D2_lscs,mat_H2_lscs,mat_V2_lscs]
120 strat = rand.sample(xrange(ln),int(taux*ln))
121 #new_l = [randint(0,1) if i in strat else kl[i] for i in xrange(ln)]
122 new_l = [0 if i in strat else kl[i] for i in xrange(ln)]
124 #print "taile_lp",len(lp), "taille de new_l",len(new_l),"nb 1",sum( new_l)
125 mat_D2_lscs,mat_H2_lscs,mat_V2_lscs = lp[0],lp[1],lp[2]
126 # Tatouage de la matrice D2")
127 new_D2 = embarque2(mat_D2_lscs,
130 new_H2 = embarque2(mat_H2_lscs,
133 new_V2 = embarque2(mat_V2_lscs,
136 # reconstruction de la matrice complete
137 new_matrice = (pywt.waverec2((A2,
138 (new_H2,new_V2,new_D2),
139 (H1,V1,D1)),'db1')).reshape((taillex,tailley))
141 new_matrice = arrondi_en_entier(new_matrice)
143 (l,h,at) = Attaque._commun_in(new_matrice)
144 #ch = "ImgAttLSCD2H2V2.png"
145 #TODO : utiliser le module de fichier temporaire de python
151 def changeLSC(mat,taux):
153 (taillex,tailley) = mat.shape
154 mat_lscs = matrice_lscs(matrice_to_bits(mat))
156 strat = rand.sample(xrange(ln),int(taux*ln))
159 new_matrice = embarque2(mat_lscs,mat)
160 (l,h,at) = Attaque._commun_in(new_matrice)
161 #ch = "ImgAttLSC_"+str(taux)+".png"
162 #TODO : utiliser le module de fichier temporaire de python
170 def redimensionnement(mat, facteur, nombre = 1):
172 Attaque par redimensionnement de l'image.
174 (l,h,at) = Attaque._commun_in(mat)
175 return Attaque._commun_out(at)
180 for k in xrange(nombre):
181 lp,hp = int(l*facteur),int(h*facteur)
182 print "l,h apres",lp,hp
183 atb = at.resize((lp,hp))
184 atc = atb.resize((l,h))
185 return Attaque._commun_out(atc)
188 def flou(mat,taux = 1):
191 Attaque en jouant sur le flou
192 - taux = 1 : image d'origine,
193 - taux < 1 : image plus floue,
194 - taux > 1 : image avec correction majorée.
195 http://fr.wikipedia.org/wiki/Masque_flou
197 (_,_,at) = Attaque._commun_in(mat)
198 amelioration = ImageEnhance.Sharpness(at)
199 atb = amelioration.enhance(taux)
200 return Attaque._commun_out(atb)
204 def contraste(mat,taux = 1):
205 ch = '5007_contrast_'+str(taux)+'.png'
208 Attaque en jouant sur le flou/la netteté :
209 - taux = 1 : image d'origine,
210 - taux = 0 : tout se ramène à 125 -> gris
211 - taux > 100 : seuil à 125 -> noir et blanc
213 (_,_,at) = Attaque._commun_in(mat)
214 amelioration = ImageEnhance.Contrast(at)
215 atb = amelioration.enhance(taux)
217 return Attaque._commun_out(atb)
225 r[i][j]=float(mat[i][j])
233 choix = rand.randint(0,nb_at-1)
235 r=Attaque.rotation(mat,90*rand.random(), 1)
237 r=Attaque.jp2(mat,"alea",int(100*rand.random()))
239 r=Attaque.decoupage(mat, int(rand.random()*min(l,c)), (0,0))
241 r=Attaque.redimensionnement(mat,0.5+rand.random(),1)
243 r=Attaque.flou(mat, 0.70+.6*rand.random())
245 r=Attaque.contraste(mat,0.70+.6*rand.random())
247 r=Attaque.jpeg(mat,"alea",int(100*rand.random()))
249 r=Attaque.changeLSC_wave(mat,rand.random())
251 r=Attaque.changeLSC(mat,rand.random())
252 rp = Attaque.enfloat(r)
260 nom;../images/5007;#lscs;147447;#diff it ; 47.9195914464;PSNR;44.0405071178;0.617849125448;2.52429686599;4.68710790996;6.99369943098;9.31317693815;12.0558573589;14.8039634581;17.3262256947;19.9583579184;22.7105332764;25.3908183958;28.3478131125;30.9765542873;33.6554829871;36.2869370011;38.8702381195;41.4840586787;44.1731605255;46.6303146215;49.1912348166