Mercurial > ift6266
comparison data_generation/transformations/BruitGauss.py @ 167:1f5937e9e530
More moves - transformations into data_generation, added "deep" folder
author | Dumitru Erhan <dumitru.erhan@gmail.com> |
---|---|
date | Fri, 26 Feb 2010 14:15:38 -0500 |
parents | transformations/BruitGauss.py@7640cb31cf1f |
children | d5b2b6397a5a |
comparison
equal
deleted
inserted
replaced
166:17ae5a1a4dd1 | 167:1f5937e9e530 |
---|---|
1 #!/usr/bin/python | |
2 # coding: utf-8 | |
3 | |
4 ''' | |
5 Ajout de bruit gaussien dans les donnees. A chaque iteration, un bruit poivre | |
6 et sel est ajoute, puis un lissage gaussien autour de ce point est ajoute. | |
7 On fait un nombre d'iteration = 1024*complexity/25 ce qui equivaud | |
8 a complexity/25 des points qui recoivent le centre du noyau gaussien. | |
9 Il y en a beaucoup moins que le bruit poivre et sel, car la transformation | |
10 est plutôt aggressive et touche beaucoup de pixels autour du centre | |
11 | |
12 La grandeur de la gaussienne ainsi que son ecart type sont definit par complexity | |
13 et par une composante aleatoire normale. | |
14 | |
15 On a 25 % de chances d'effectuer le bruitage | |
16 | |
17 Ce fichier prend pour acquis que les images sont donnees une a la fois | |
18 sous forme de numpy.array de 1024 (32 x 32) valeurs entre 0 et 1. | |
19 | |
20 Sylvain Pannetier Lebeuf dans le cadre de IFT6266, hiver 2010 | |
21 | |
22 ''' | |
23 | |
24 import numpy | |
25 #import random | |
26 import scipy | |
27 from scipy import ndimage | |
28 | |
29 class BruitGauss(): | |
30 | |
31 def __init__(self,complexity=1,seed=6378): | |
32 self.nb_chngmax =10 #Le nombre de pixels changes. Seulement pour fin de calcul | |
33 self.grandeurmax = 20 | |
34 self.sigmamax = 6.0 | |
35 self.regenerate_parameters(complexity) | |
36 self.seed=seed | |
37 | |
38 #numpy.random.seed(self.seed) | |
39 | |
40 def get_seed(self): | |
41 return self.seed | |
42 | |
43 def get_settings_names(self): | |
44 return ['nb_chng','sigma_gauss','grandeur'] | |
45 | |
46 def regenerate_parameters(self, complexity): | |
47 self.effectuer =numpy.random.binomial(1,0.25) ##### On a 25% de faire un bruit ##### | |
48 | |
49 | |
50 if self.effectuer and complexity > 0: | |
51 self.nb_chng=3+int(numpy.random.rand()*self.nb_chngmax*complexity) | |
52 self.sigma_gauss=2.0 + numpy.random.rand()*self.sigmamax*complexity | |
53 self.grandeur=12+int(numpy.random.rand()*self.grandeurmax*complexity) | |
54 #creation du noyau gaussien | |
55 self.gauss=numpy.zeros((self.grandeur,self.grandeur)) | |
56 x0 = y0 = self.grandeur/2.0 | |
57 for i in xrange(self.grandeur): | |
58 for j in xrange(self.grandeur): | |
59 self.gauss[i,j]=numpy.exp(-((i-x0)**2 + (j-y0)**2) / self.sigma_gauss**2) | |
60 #creation de la fenetre de moyennage | |
61 self.moy=numpy.zeros((self.grandeur,self.grandeur)) | |
62 x0 = y0 = self.grandeur/2 | |
63 for i in xrange(0,self.grandeur): | |
64 for j in xrange(0,self.grandeur): | |
65 self.moy[i,j]=((numpy.sqrt(2*(self.grandeur/2.0)**2) -\ | |
66 numpy.sqrt(numpy.abs(i-self.grandeur/2.0)**2+numpy.abs(j-self.grandeur/2.0)**2))/numpy.sqrt((self.grandeur/2.0)**2))**5 | |
67 else: | |
68 self.sigma_gauss = 1 # eviter division par 0 | |
69 self.grandeur=1 | |
70 self.nb_chng = 0 | |
71 self.effectuer = 0 | |
72 | |
73 return self._get_current_parameters() | |
74 | |
75 def _get_current_parameters(self): | |
76 return [self.nb_chng,self.sigma_gauss,self.grandeur] | |
77 | |
78 | |
79 def transform_image(self, image): | |
80 if self.effectuer == 0: | |
81 return image | |
82 image=image.reshape((32,32)) | |
83 filtered_image = ndimage.convolve(image,self.gauss,mode='constant') | |
84 assert image.shape == filtered_image.shape | |
85 filtered_image = (filtered_image - filtered_image.min() + image.min()) / (filtered_image.max() - filtered_image.min() + image.min()) * image.max() | |
86 | |
87 #construction of the moyennage Mask | |
88 Mask = numpy.zeros((32,32)) | |
89 | |
90 for i in xrange(0,self.nb_chng): | |
91 x_bruit=int(numpy.random.randint(0,32)) | |
92 y_bruit=int(numpy.random.randint(0,32)) | |
93 offsetxmin = 0 | |
94 offsetxmax = 0 | |
95 offsetymin = 0 | |
96 offsetymax = 0 | |
97 if x_bruit < self.grandeur / 2: | |
98 offsetxmin = self.grandeur / 2 - x_bruit | |
99 if 32-x_bruit < numpy.ceil(self.grandeur / 2.0): | |
100 offsetxmax = numpy.ceil(self.grandeur / 2.0) - (32-x_bruit) | |
101 if y_bruit < self.grandeur / 2: | |
102 offsetymin = self.grandeur / 2 - y_bruit | |
103 if 32-y_bruit < numpy.ceil(self.grandeur / 2.0): | |
104 offsetymax = numpy.ceil(self.grandeur / 2.0) - (32-y_bruit) | |
105 Mask[x_bruit - self.grandeur/2 + offsetxmin : x_bruit + numpy.ceil(self.grandeur/2.0) - offsetxmax,\ | |
106 y_bruit - self.grandeur/2 + offsetymin : y_bruit + numpy.ceil(self.grandeur/2.0)- offsetymax] +=\ | |
107 self.moy[offsetxmin:self.grandeur - offsetxmax,offsetymin:self.grandeur - offsetymax] | |
108 | |
109 return numpy.asarray((image + filtered_image*Mask)/(Mask+1),dtype='float32') | |
110 | |
111 #---TESTS--- | |
112 | |
113 def _load_image(): | |
114 f = open('/home/sylvain/Dropbox/Msc/IFT6266/donnees/lower_test_data.ft') #Le jeu de donnees est en local. | |
115 d = ft.read(f) | |
116 w=numpy.asarray(d[0]) | |
117 return (w/255.0).astype('float') | |
118 | |
119 def _test(complexite): | |
120 img=_load_image() | |
121 transfo = BruitGauss() | |
122 pylab.imshow(img.reshape((32,32))) | |
123 pylab.show() | |
124 print transfo.get_settings_names() | |
125 print transfo.regenerate_parameters(complexite) | |
126 | |
127 img_trans=transfo.transform_image(img) | |
128 | |
129 pylab.imshow(img_trans.reshape((32,32))) | |
130 pylab.show() | |
131 | |
132 | |
133 if __name__ == '__main__': | |
134 from pylearn.io import filetensor as ft | |
135 import pylab | |
136 _test(0.5) | |
137 | |
138 |