comparison transformations/Occlusion.py @ 74:f3e4328e3514

Contraste entre image et bruit renforce et proba 0.2 d'effectuer l'occlusion
author SylvainPL <sylvain.pannetier.lebeuf@umontreal.ca>
date Wed, 10 Feb 2010 14:03:50 -0500
parents 27bf31dca87d
children 5d22498c73d1
comparison
equal deleted inserted replaced
73:859ebd7f8754 74:f3e4328e3514
6 6
7 Le bruit provient d'un echantillon pris dans la seconde image puis rajoutee a 7 Le bruit provient d'un echantillon pris dans la seconde image puis rajoutee a
8 gauche ou a droite de l'image originale. De plus, il se peut aussi que le 8 gauche ou a droite de l'image originale. De plus, il se peut aussi que le
9 bruit soit rajoute sur l'image originale, mais en plus pâle. 9 bruit soit rajoute sur l'image originale, mais en plus pâle.
10 10
11 Il faut s'assurer d'avoir le fichier echantillon_occlusion.ft (voir "files" sur assembla) 11 Le fichier /data/lisa/data/ift6266h10/echantillon_occlusion.ft
12 dans le repertoire ou est effectuee l'execution de Occlusion.py. Sinon, 12 (sur le reseau DIRO) est necessaire.
13 simplement changer le "path" sur la ligne 46 13
14 Il y a 20% de chance d'avoir une occlusion quelconque.
14 15
15 Sylvain Pannetier Lebeuf dans le cadre de IFT6266, hiver 2010 16 Sylvain Pannetier Lebeuf dans le cadre de IFT6266, hiver 2010
16 17
17 ''' 18 '''
18 19
19 20
20 import numpy 21 import numpy
21 import scipy 22
22 import pylab
23 from pylearn.io import filetensor as ft 23 from pylearn.io import filetensor as ft
24 24
25 class Occlusion(): 25 class Occlusion():
26 26
27 def __init__(self): 27 def __init__(self):
42 self.endroit=-1 42 self.endroit=-1
43 43
44 #Cette variable determine l'opacite de l'ajout dans le cas ou on est au milieu 44 #Cette variable determine l'opacite de l'ajout dans le cas ou on est au milieu
45 self.opacite=0.5 #C'est completement arbitraire. Possible de le changer si voulu 45 self.opacite=0.5 #C'est completement arbitraire. Possible de le changer si voulu
46 46
47 #Sert a dire si on fait quelque chose. 0=faire rien, 1 on fait quelque chose
48 self.appliquer=1
49
47 f3 = open('/data/lisa/data/ift6266h10/echantillon_occlusion.ft') #Doit etre sur le reseau DIRO. 50 f3 = open('/data/lisa/data/ift6266h10/echantillon_occlusion.ft') #Doit etre sur le reseau DIRO.
51 #f3 = open('/home/sylvain/Dropbox/Msc/IFT6266/donnees/echantillon_occlusion.ft')
48 #Il faut arranger le path sinon 52 #Il faut arranger le path sinon
49 w=ft.read(f3) 53 w=ft.read(f3)
50 f3.close() 54 f3.close()
51 55
52 self.longueur=len(w) 56 self.longueur=len(w)
53 self.d=(w.astype('float'))/255 57 self.d=(w.astype('float'))/255
54 58
55 59
56 def get_settings_names(self): 60 def get_settings_names(self):
57 return ['haut','bas','gauche','droite','x_arrivee','y_arrivee','endroit','rajout'] 61 return ['haut','bas','gauche','droite','x_arrivee','y_arrivee','endroit','rajout','appliquer']
58 62
59 def regenerate_parameters(self, complexity): 63 def regenerate_parameters(self, complexity):
60 self.haut=min(15,int(numpy.abs(numpy.random.normal(int(7*complexity),2)))) 64 self.haut=min(15,int(numpy.abs(numpy.random.normal(int(7*complexity),2))))
61 self.bas=min(15,int(numpy.abs(numpy.random.normal(int(7*complexity),2)))) 65 self.bas=min(15,int(numpy.abs(numpy.random.normal(int(7*complexity),2))))
62 self.gauche=min(15,int(numpy.abs(numpy.random.normal(int(7*complexity),2)))) 66 self.gauche=min(15,int(numpy.abs(numpy.random.normal(int(7*complexity),2))))
70 #Ces deux valeurs seront controlees afin d'etre certain de ne pas depasser 74 #Ces deux valeurs seront controlees afin d'etre certain de ne pas depasser
71 self.x_arrivee=int(numpy.abs(numpy.random.normal(0,2))) #Complexity n'entre pas en jeu, pas besoin 75 self.x_arrivee=int(numpy.abs(numpy.random.normal(0,2))) #Complexity n'entre pas en jeu, pas besoin
72 self.y_arrivee=int(numpy.random.normal(0,3)) 76 self.y_arrivee=int(numpy.random.normal(0,3))
73 77
74 self.rajout=numpy.random.randint(0,self.longueur) #les bouts de quelle lettre 78 self.rajout=numpy.random.randint(0,self.longueur) #les bouts de quelle lettre
79 self.appliquer=numpy.random.binomial(1,0.2) ##### 20 % du temps, on met une occlusion #####
80
81 if complexity == 0: #On ne fait rien dans ce cas
82 self.applique=0
75 83
76 self.endroit=numpy.random.randint(-1,2) 84 self.endroit=numpy.random.randint(-1,2)
77 #####Revoir si ces trois dernieres variables sont determinees ici ! 85
78 return self._get_current_parameters() 86 return self._get_current_parameters()
79 87
80 def _get_current_parameters(self): 88 def _get_current_parameters(self):
81 return [self.haut,self.bas,self.gauche,self.droite,self.x_arrivee,self.y_arrivee,self.endroit,self.rajout] 89 return [self.haut,self.bas,self.gauche,self.droite,self.x_arrivee,self.y_arrivee,self.endroit,self.rajout,self.appliquer]
82 90
83 91
84 def transform_image(self, image): 92 def transform_image(self, image):
93 if self.appliquer == 0: #Si on fait rien, on retourne tout de suite l'image
94 return image
95
85 #Attrapper le bruit d'occlusion 96 #Attrapper le bruit d'occlusion
86 bruit=self.d[self.rajout].reshape((32,32))[15-self.haut:15+self.bas+1,15-self.gauche:15+self.droite+1] 97 bruit=self.d[self.rajout].reshape((32,32))[15-self.haut:15+self.bas+1,15-self.gauche:15+self.droite+1]
87 98
88 if self.x_arrivee+self.gauche+self.droite>32: 99 if self.x_arrivee+self.gauche+self.droite>32:
89 self.endroit*=-1 #On change de bord et on colle sur le cote 100 self.endroit*=-1 #On change de bord et on colle sur le cote
92 self.y_arrivee=self.haut-16#On colle le morceau en haut 103 self.y_arrivee=self.haut-16#On colle le morceau en haut
93 if self.y_arrivee+self.bas > 15: 104 if self.y_arrivee+self.bas > 15:
94 self.y_arrivee=15-self.bas #On colle le morceau en bas 105 self.y_arrivee=15-self.bas #On colle le morceau en bas
95 106
96 if self.endroit==-1: #a gauche 107 if self.endroit==-1: #a gauche
97 image[(16+self.y_arrivee-self.haut):(16+self.y_arrivee+self.bas+1),(self.x_arrivee):(self.x_arrivee+self.gauche+self.droite+1)]=image[(16+self.y_arrivee-self.haut):(16+self.y_arrivee+self.bas+1),(self.x_arrivee):(self.x_arrivee+self.gauche+self.droite+1)]+bruit 108 for i in xrange(-self.haut,self.bas+1):
98 109 for j in xrange(0,self.gauche+self.droite+1):
110 image[16+self.y_arrivee+i,self.x_arrivee+j]=\
111 max(image[16+self.y_arrivee+i,self.x_arrivee+j],bruit[i+self.haut,j])
112
99 elif self.endroit==1: #a droite 113 elif self.endroit==1: #a droite
100 image[(16+self.y_arrivee-self.haut):(16+self.y_arrivee+self.bas+1),(31-self.x_arrivee-self.gauche-self.droite):(31-self.x_arrivee+1)]=image[(16+self.y_arrivee-self.haut):(16+self.y_arrivee+self.bas+1),(31-self.x_arrivee-self.gauche-self.droite):(31-self.x_arrivee+1)]+bruit 114 for i in xrange(-self.haut,self.bas+1):
101 115 for j in xrange(-self.gauche-self.droite,1):
116 image[16+self.y_arrivee+i,31-self.x_arrivee+j]=\
117 max(image[16+self.y_arrivee+i,31-self.x_arrivee+j],bruit[i+self.haut,j+self.gauche+self.droite])
118
102 elif self.endroit==0: #au milieu 119 elif self.endroit==0: #au milieu
103 image[(16-self.haut):(16+self.bas+1),(16-self.gauche):(16+self.droite+1)]=image[(16-self.haut):(16+self.bas+1),(16-self.gauche):(16+self.droite+1)]+(bruit*self.opacite) 120 for i in xrange(-self.haut,self.bas+1):
104 121 for j in xrange(-self.gauche,self.droite+1):
105 #renormaliser le tout. Toutes les entrees doivent etre entre 0 et 1 122 image[16+i,16+j]=max(image[16+i,16+j],bruit[i+self.haut,j+self.gauche]*self.opacite)
106 for ii in xrange(0,32): 123
107 for jj in xrange(0,32):
108 image[ii,jj]=min(1,image[ii,jj])
109 124
110 return image 125 return image
111 126
112 #---TESTS--- 127 #---TESTS---
113 128
133 pylab.show() 148 pylab.show()
134 149
135 150
136 if __name__ == '__main__': 151 if __name__ == '__main__':
137 import pylab 152 import pylab
153 import scipy
138 _test(0.5) 154 _test(0.5)