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