Mercurial > ift6266
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) |