2 from ImageChops import difference
10 from dwt_marquage import Marquage_DWT
11 from outilsBase import conversion, getBit, setBit
15 Classe permettant l'évaluation du marquage. Les deux images doivent être de
19 def __init__(self, image1 = None, image2 = None):
22 Les deux images doivent être de type Image !
26 # TODO Tester l'appartenance à Image
27 assert self._image1.mode == self._image2.mode
28 assert self._image1.size == self._image2.size
33 for k in range(self._image1.size[0]):
34 for l in range(self._image1.size[1]):
35 eqm+=(self._image1.getpixel((k,l)) - \
36 self._image2.getpixel((k,l)))**2
37 return float(eqm)/self._image1.size[0]/self._image1.size[1]
40 def _bitsParCoef(self):
41 if self._image1.mode == '1':
43 elif self._image1.mode == 'L':
46 raise ValueError("Mode non supporté pour l'évaluation")
51 Retourne le PSNR entre deux images.
54 densite = 2**self._bitsParCoef()-1
56 return 10*log(densite**2/self._EQM(),10)
61 def differences(self):
63 Renvoie le nombre de coefficients différents,
64 vu comme un pourcentage.
67 for k in range(self._image1.size[0]):
68 for l in range(self._image1.size[1]):
69 if self._image1.getpixel((k,l)) != self._image2.getpixel((k,l)):
71 return 100*float(compteur)/self._image1.size[0]/self._image1.size[1]
73 def differences_sur_marque(self,liste,lscs,coefficient,img_att,mat_dw):
75 Renvoie le pourcentage de bits différents entre la marque embarquee
76 et la marque attaquée et exprimée comme un pourcentage.
78 # on recupere les indices contenant la marque
79 # on compare les valeurs des images en ces indices
82 #liste : valeurs des bits qui devraient être présents
83 #matrice : valeur des coefs (doit etre calculee)
84 #lscs : indices des coefs lsc
85 marquage_dwt = Marquage_DWT(img_att,
88 matrice = marquage_dwt.get_matrice_DWT(coefficient)
89 print matrice[:10,:10]
91 m,n = len(matrice), len(matrice[0])
93 #print m,n,liste,matrice,lscs
101 #print "Bit", getBit(str(matrice[l,c]),lsc)
102 if getBit(str(matrice[l,c]),lsc) != liste[cpt] :
108 # print "diff--------",diff,excp
109 return 100*diff/float(len(liste))
117 for k in range(self._image1.size[0]):
118 for l in range(self._image1.size[1]):
119 if self._image1.getpixel((k,l)) != self._image2.getpixel((k,l)):
121 return 100*float(compteur)/self._image1.size[0]/self._image1.size[1]
125 def visualisationDifferences(self, facteur = 0, nom = ''):
127 Visualise les différences, avec Image
129 extreme = self.differencesExtremales()[1]
132 elif facteur*extreme > 255:
133 raise ValueError('Facteur de visualisation trop élevé')
136 leFacteur = 255/extreme
139 #print 'Facteur de visualisation : ', leFacteur
141 difference(self._image1,self._image2).point(lambda x:leFacteur*x).save(nom)
142 #difference(self._image1,self._image2).point(lambda x:leFacteur*x).show()
143 dd = list(difference(self._image1,self._image2).point(lambda x:leFacteur*x).getdata())
144 #print "Nombre de différences",len(dd)-dd.count(0),"sur",len(dd)
148 def differenceMoyenne(self):
150 Renvoie la différence moyenne entre les images
152 stats = ImageStat.Stat(difference(self._image1,
153 self._image2).histogram())
154 if self._image1.mode == '1':
155 return float(stats.mean[0])/255
160 def differencesExtremales(self):
162 Renvoie le minimum et le maximum des différences des images
164 stats = ImageStat.Stat(difference(self._image1,
165 self._image2).histogram())
166 if self._image1.mode == '1':
167 return (int(float(stats.extrema[0][0])/255),
168 int(float(stats.extrema[0][1])/255))
170 return stats.extrema[0][0], stats.extrema[0][1]
173 def _differencesHistogramme(self):
175 Histogramme des différences, pour differencesHistoVisu
177 histo = difference(self._image1, self._image2).histogram()
179 for l in range(1,self.differencesExtremales()[1]+1):
180 liste.append((l,histo[l]))
184 def differencesHistoVisu(self):
186 Affiche l'histrogramme des différences, avec PyX
189 for k in self._differencesHistogramme():
190 liste.append((k[0],k[1]))
192 raise ValueError("Aucune différence")
193 g = graph.graphxy(width=8, x=graph.axis.bar())
194 g.plot(graph.data.points(liste, xname=0, y=2),[graph.style.bar()])
195 g.writeEPSfile('histoDiff.eps')
196 system('evince histoDiff.eps')