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

Private GIT Repository
tt
[HindawiJournalOfChaos.git] / IH / iihmsp13 / exp / evaluation.py
1 #-*- coding:utf-8 -*-
2 from ImageChops import difference
3 from Image import *
4 import ImageStat
5
6 from sys import exit
7 from os import system
8 from pyx import *
9
10 from dwt_marquage import Marquage_DWT
11 from outilsBase import conversion, getBit, setBit
12
13 class Evaluation:
14     '''
15     Classe permettant l'évaluation du marquage. Les deux images doivent être de
16     type Image
17     '''
18         
19     def __init__(self, image1 = None, image2 = None):
20         '''
21         Constructeur.
22         Les deux images doivent être de type Image !
23         '''
24         self._image1  = image1
25         self._image2  = image2
26         # TODO Tester l'appartenance à Image
27         assert self._image1.mode == self._image2.mode
28         assert self._image1.size == self._image2.size
29         
30     
31     def _EQM(self):
32         eqm = 0
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]
38     
39
40     def _bitsParCoef(self):
41         if self._image1.mode == '1':
42             return 1
43         elif self._image1.mode == 'L':
44             return 8
45         else:
46             raise ValueError("Mode non supporté pour l'évaluation")
47
48
49     def PSNR(self):
50         '''
51         Retourne le PSNR entre deux images.
52         '''
53         from math import log
54         densite = 2**self._bitsParCoef()-1
55         if self._EQM()!=0:
56             return 10*log(densite**2/self._EQM(),10)
57         else:
58             return "Infini"
59
60
61     def differences(self):
62         '''
63         Renvoie le nombre de coefficients différents,
64         vu comme un pourcentage.
65         '''
66         compteur = 0
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)):
70                     compteur+=1
71         return 100*float(compteur)/self._image1.size[0]/self._image1.size[1]
72
73     def differences_sur_marque(self,liste,lscs,coefficient,img_att,mat_dw):
74         '''
75         Renvoie le pourcentage de bits différents entre la marque embarquee
76         et la marque attaquée et exprimée comme un pourcentage.
77         '''
78         # on recupere les indices contenant la marque
79         # on compare les valeurs des images en ces indices
80
81
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,
86                           famille = 'db1')
87
88         matrice = marquage_dwt.get_matrice_DWT(coefficient)
89         print matrice[:10,:10]
90         print mat_dw[:10,:10]
91         m,n = len(matrice), len(matrice[0])
92         print liste[:10]
93         #print m,n,liste,matrice,lscs
94         cpt = 0
95         diff = 0
96         excp = 0
97         for l in range(m):
98             for c in range(n):
99                 for lsc in lscs:
100                     try:
101                         #print "Bit", getBit(str(matrice[l,c]),lsc)
102                         if getBit(str(matrice[l,c]),lsc) != liste[cpt] :
103                             diff +=1
104                         cpt += 1
105                     except:
106                         excp +=1
107                         pass
108 #        print "diff--------",diff,excp
109         return 100*diff/float(len(liste))
110
111
112
113         
114         
115         compteur = 0
116         
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)):
120                     compteur+=1
121         return 100*float(compteur)/self._image1.size[0]/self._image1.size[1]
122         
123     
124
125     def visualisationDifferences(self, facteur = 0, nom = ''):
126         '''
127         Visualise les différences, avec Image
128         '''
129         extreme = self.differencesExtremales()[1]
130         if extreme == 0:
131             leFacteur = 0
132         elif facteur*extreme > 255:
133             raise ValueError('Facteur de visualisation trop élevé')
134             exit(1)
135         elif facteur == 0:
136             leFacteur = 255/extreme
137         else:
138             leFacteur = facteur
139         #print 'Facteur de visualisation : ', leFacteur
140         if nom !='':
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)
145
146     
147     
148     def differenceMoyenne(self):
149         '''
150         Renvoie la différence moyenne entre les images
151         '''
152         stats = ImageStat.Stat(difference(self._image1,
153                                           self._image2).histogram())
154         if self._image1.mode == '1':
155             return float(stats.mean[0])/255
156         else:
157             return stats.mean[0]
158
159
160     def differencesExtremales(self):
161         '''
162         Renvoie le minimum et le maximum des différences des images
163         '''
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))
169         else:
170             return stats.extrema[0][0], stats.extrema[0][1]    
171     
172     
173     def _differencesHistogramme(self):
174         '''
175         Histogramme des différences, pour differencesHistoVisu
176         '''
177         histo = difference(self._image1, self._image2).histogram()
178         liste = []
179         for l in range(1,self.differencesExtremales()[1]+1):
180             liste.append((l,histo[l]))
181         return liste
182     
183     
184     def differencesHistoVisu(self):
185         '''
186         Affiche l'histrogramme des différences, avec PyX
187         '''
188         liste = []
189         for k in self._differencesHistogramme():
190             liste.append((k[0],k[1]))
191         if len(liste) == 0:
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')