]> AND Private Git Repository - HindawiJournalOfChaos.git/blob - IH/iihmsp13/exp/attaque.py
Logo AND Algorithmique Numérique Distribuée

Private GIT Repository
abstract, conclusion
[HindawiJournalOfChaos.git] / IH / iihmsp13 / exp / attaque.py
1 #-*- coding:utf-8 -*-
2 from os import system
3 import Image as Im
4 import ImageEnhance
5 import PythonMagick as pm
6 import numpy as np
7 import pywt
8 from ConfigParser import ConfigParser
9 import random as rand
10 from outilsBase import *
11 #from script_spatial import ci2_watermark
12 LSCs= [1]
13  
14
15
16 class Attaque:
17     @staticmethod
18     def _commun_in(mat):
19         (l,h)=mat.shape
20         at = Im.new("L",(l,h))
21         at.putdata(mat.flatten())
22         return (l,h,at)
23
24     @staticmethod
25     def _commun_out(at):
26         (l,h)=at.size
27         return np.array(at.getdata()).reshape((l,h))
28     
29
30     @staticmethod
31     def rotation(mat,angle, nombre=1):
32         angleb=angle
33         #angleb = 0
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")
44         return atq
45
46
47
48
49     @staticmethod
50     def ci2_watermark_again(mat,marque,ni):
51         (atq,_,_,_) = ci2_watermark(mat,marque,ni)
52         return atq
53
54
55     @staticmethod
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)
65         at = Im.open(ch)
66         system('rm '+ch)
67         return Attaque._commun_out(at) 
68         
69
70     @staticmethod
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)        
77         at.save("img.bmp")
78         img_2_nm = "img_"+str(taux)+"_.jp2"
79         
80         st = "convert img.bmp -define jp2:rate="+\
81             str(taux/float(100))+" "+img_2_nm
82         #print st
83         system(st)
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')
88         system("rm img.bmp")
89         return Attaque._commun_out(atb) 
90
91
92     @staticmethod
93     def decoupage(mat, taille = 50, position = (0,0)):
94         '''
95         Attaque par découpage de l'image.
96         '''
97         (_,_,at) = Attaque._commun_in(mat)        
98         if taille > 0 :
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) 
103
104
105     @staticmethod
106     def changeLSC_wave(mat,taux):
107         #print mat
108         (taillex,tailley) = mat.shape
109         A2,(mat_H2,mat_V2,mat_D2),(H1,V1,D1)  = pywt.wavedec2(mat,
110                                                               'db1',
111                                                               level = 2)        
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)
115
116         l = [mat_D2_lscs,mat_H2_lscs,mat_V2_lscs]
117         lp = [] 
118         for kl in l : 
119             ln = len(kl)
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)]
123             lp += [new_l]
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,
128                            mat_D2,LSCs)    
129
130         new_H2 = embarque2(mat_H2_lscs,
131                            mat_H2,LSCs)    
132
133         new_V2 = embarque2(mat_V2_lscs,
134                            mat_V2,LSCs)    
135
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))
140
141         new_matrice = arrondi_en_entier(new_matrice)
142
143         (l,h,at) = Attaque._commun_in(new_matrice)        
144         #ch = "ImgAttLSCD2H2V2.png"
145         #TODO : utiliser le module de fichier temporaire de python
146         #at.save(ch)
147         return new_matrice
148
149
150     @staticmethod
151     def changeLSC(mat,taux):
152         #print mat
153         (taillex,tailley) = mat.shape
154         mat_lscs = matrice_lscs(matrice_to_bits(mat))
155         ln = len(mat_lscs)
156         strat = rand.sample(xrange(ln),int(taux*ln))
157         for i in strat:
158             mat_lscs[i]=0 
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
163         #at.save(ch)
164         return new_matrice
165
166
167
168
169     @staticmethod
170     def redimensionnement(mat, facteur, nombre = 1):
171         '''
172         Attaque par redimensionnement de l'image. 
173         '''
174         (l,h,at) = Attaque._commun_in(mat)        
175         return Attaque._commun_out(at) 
176         
177
178
179
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) 
186
187     @staticmethod
188     def flou(mat,taux = 1):
189
190         '''
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
196         '''
197         (_,_,at) = Attaque._commun_in(mat)        
198         amelioration = ImageEnhance.Sharpness(at)
199         atb = amelioration.enhance(taux)
200         return Attaque._commun_out(atb) 
201
202
203     @staticmethod
204     def contraste(mat,taux = 1):
205         ch = '5007_contrast_'+str(taux)+'.png'
206
207         '''
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
212         '''
213         (_,_,at) = Attaque._commun_in(mat)        
214         amelioration = ImageEnhance.Contrast(at)
215         atb = amelioration.enhance(taux)
216 #        atb.save(ch)
217         return Attaque._commun_out(atb) 
218
219     @staticmethod
220     def enfloat(mat):
221         (l,c)=mat.shape
222         r=np.zeros((l,c))
223         for i in xrange(l):
224             for j in xrange(c) :
225                 r[i][j]=float(mat[i][j])
226         return r
227
228     @staticmethod
229     def alea(mat):        
230         (l,c)=mat.shape
231         r=None
232         nb_at = 9
233         choix = rand.randint(0,nb_at-1)
234         if choix == 0:
235             r=Attaque.rotation(mat,90*rand.random(), 1)
236         if choix == 1:
237             r=Attaque.jp2(mat,"alea",int(100*rand.random()))
238         if choix == 2:
239             r=Attaque.decoupage(mat, int(rand.random()*min(l,c)), (0,0))
240         if choix == 3:
241             r=Attaque.redimensionnement(mat,0.5+rand.random(),1)
242         if choix == 4:
243             r=Attaque.flou(mat, 0.70+.6*rand.random())
244         if choix == 5:
245             r=Attaque.contraste(mat,0.70+.6*rand.random())
246         if choix == 6:
247             r=Attaque.jpeg(mat,"alea",int(100*rand.random()))
248         if choix == 7:
249             r=Attaque.changeLSC_wave(mat,rand.random())
250         if choix == 8:
251             r=Attaque.changeLSC(mat,rand.random())
252         rp = Attaque.enfloat(r)
253         return rp
254         
255
256
257
258 """
259 avec mise a zero :
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
261 """