5 import PythonMagick as pm
7 from ConfigParser import ConfigParser
14 at = Im.new("L",(l,h))
15 at.putdata(mat.flatten())
21 return np.array(at.getdata()).reshape((l,h))
25 def rotation(mat,angle, nombre):
26 (l,h,at) = Attaque._commun_in(mat)
27 for k in range(nombre):
28 carreNoir=Im.new('L',(l*3,h*3),color=1)
29 carreNoir.paste(at,(l+1,h+1))
30 tourne = carreNoir.rotate(angle)
31 carreNoir = tourne.rotate(-angle)
32 carreNoir = carreNoir.crop((l+1,h+1,2*l+1,2*h+1))
33 #carreNoir = carreNoir.crop((l+1,h+1,2*l+1,2*h+1))
35 return Attaque._commun_out(carreNoir)
39 def jpeg(mat,nom_temp,taux = 100):
40 '''Attaque par compression jpeg :
41 - taux = 100 : image d'origine,
42 - taux 75 : compression par défaut,
43 - taux = 1 : le plus fort taux de compression.'''
44 (l,h,at) = Attaque._commun_in(mat)
45 ch = nom_temp+'_'+str(taux)+'.jpg'
46 #TODO : utiliser le module de fichier temporaire de python
47 at.save(ch,quality = taux)
50 return Attaque._commun_out(at)
54 def jp2(mat,nom_temp,taux = 100):
55 '''Attaque par compression jpeg :
56 - taux = 100 : image d'origine,
57 - taux 75 : compression par défaut,
58 - taux = 1 : le plus fort taux de compression.'''
59 (l,h,at) = Attaque._commun_in(mat)
61 img_2_nm = "img_"+str(taux)+"_.jp2"
63 st = "convert img.bmp -define jp2:rate="+\
64 str(taux/float(100))+" "+img_2_nm
67 system("convert "+img_2_nm+" img_2.png")
68 atb = Im.open("img_2.png")
69 return Attaque._commun_out(atb)
73 def decoupage(mat, taille = 50, position = (0,0)):
75 Attaque par découpage de l'image.
77 (_,_,at) = Attaque._commun_in(mat)
78 ch = '5007_dec_'+str(taille)+'.png'
80 carreNoir=Im.new('L',(taille,taille))
81 carreNoir.putdata([0 for _ in range(taille**2)])
82 at.paste(carreNoir,position)
84 return Attaque._commun_out(at)
88 def redimensionnement(mat, facteur, nombre = 1):
90 Attaque par redimensionnement de l'image.
92 (l,h,at) = Attaque._commun_in(mat)
93 for k in range(nombre):
94 atb = at.resize((int(l*facteur), int(h*facteur)))
95 atc = atb.resize((l,h))
96 return Attaque._commun_out(atc)
99 def flou(mat,taux = 1):
102 Attaque en jouant sur le flou/la netteté :
103 - taux = 1 : image d'origine,
104 - taux < 1 : image plus floue,
105 - taux > 1 : image plus nette.
107 (_,_,at) = Attaque._commun_in(mat)
108 ch = '5007_flou_'+str(taux)+'.png'
109 amelioration = ImageEnhance.Sharpness(at)
110 atb = amelioration.enhance(taux)
112 return Attaque._commun_out(atb)
116 def contraste(mat,taux = 1):
117 ch = '5007_contrast_'+str(taux)+'.png'
120 Attaque en jouant sur le flou/la netteté :
121 - taux = 1 : image d'origine,
122 - taux < 1 : image plus contrastée,
123 - taux > 1 : image plus nette.
125 (_,_,at) = Attaque._commun_in(mat)
126 amelioration = ImageEnhance.Contrast(at)
127 atb = amelioration.enhance(taux)
129 return Attaque._commun_out(atb)
136 """ choisit une des 6 attaques au hasard avec paramètre cohérents au
142 return Attaque.rotation(mat,30*random(), 1)
144 return Attaque.jp2(mat,"alea",int(100*random()))
146 return Attaque.decoupage(mat, 50, (0,0))
148 return Attaque.redimensionnement(mat, 0.75*randint(1,2),1)
150 return Attaque.flou(mat, 0.70+.6*random())
152 return Attaque.contraste(mat,0.70+.6*random())
160 r[i][j]=float(mat[i][j])
166 """ choisit une des 6 attaques au hasard avec paramètre cohérents au
173 r=Attaque.rotation(mat,30*random(), 1)
175 r=Attaque.jp2(mat,"alea",int(100*random()))
177 r=Attaque.decoupage(mat, 50, (0,0))
179 r=Attaque.redimensionnement(mat, 0.75*randint(1,2),1)
181 r=Attaque.flou(mat, 0.70+.6*random())
183 r=Attaque.contraste(mat,0.70+.6*random())
185 r=Attaque.jpeg(mat,"alea",int(100*random()))
187 rp = Attaque.enfloat(r)
192 def bruitGaussien(self, ecarttype):
194 Ajoute un bruit gaussien.
196 for x in range(self._image.size[0]):
197 for y in range(self._image.size[1]):
198 self._image.putpixel((x,y),
199 int(random.normal(self._image.getpixel((x,y)), ecarttype)))
202 def bruitUniforme(self, ecart):
204 Ajoute un bruit uniforme.
206 for x in range(self._image.size[0]):
207 for y in range(self._image.size[1]):
208 self._image.putpixel((x,y),
209 self._image.getpixel((x,y)) + \
210 int(random.uniform(-ecart,ecart)))