comparison transformations/Rature.py @ 37:5848e88f7a7a

Ajout de rature verticale, horizontale ou blique sur l'image. Compatible avec testmod.py
author SylvainPL <sylvain.pannetier.lebeuf@umontreal.ca>
date Tue, 02 Feb 2010 10:44:54 -0500
parents
children fd02fd7e6557
comparison
equal deleted inserted replaced
36:f5de107d3643 37:5848e88f7a7a
1 #!/usr/bin/python
2 # coding: utf-8
3
4 '''
5 Ajout de rature sur le caractère. La rature peut etre horizontale, verticale
6 (dans ces deux cas, l'amplacement de la bande est aleatoire) ou sur la diagonale
7 (et anti-diagonale).
8
9 La largeur de la bande ainsi que sa clarté sont definies a l'aide de complexity.
10 clarte: 0=blanc et 1=noir
11
12 Ce fichier prend pour acquis que les images sont donnees une a la fois
13 sous forme de numpy.array de 1024 (32 x 32) valeurs entre 0 et 1.
14
15 Sylvain Pannetier Lebeuf dans le cadre de IFT6266, hiver 2010
16
17 '''
18
19 import numpy
20 import random
21
22 class Rature():
23
24 def __init__(self):
25 self.largeur=2 #Largeur de la bande
26 self.deplacement=0 #Deplacement par rapport au milieu
27 self.orientation=0 #0=horizontal, 1=vertical, 2=oblique
28 self.clarte=0.5
29
30 def get_settings_names(self):
31 return ['orientation','deplacement','clarte']
32
33 def regenerate_parameters(self, complexity):
34 #Il faut choisir parmis vertical, horizontal et diagonal.
35 #La methode n'est pas exacte, mais un peu plus rapide que generer un int.
36 #Complexity n'a rien a voir avec ce choix
37
38 choix=numpy.random.random()
39
40 if choix <0.34:
41 self.orientation=0
42 elif choix <0.67:
43 self.orientation=1
44 else:
45 self.orientation=2
46
47 self.largeur=int(numpy.ceil(complexity*5))
48 self.clarte=complexity
49
50
51 return self._get_current_parameters()
52
53 def _get_current_parameters(self):
54 return [self.orientation,self.largeur,self.clarte]
55
56 def transform_image(self, image):
57 if self.orientation == 0:
58 return self._horizontal(image)
59 elif self.orientation == 1:
60 return self._vertical(image)
61 else:
62 return self._oblique(image)
63
64 def _horizontal(self,image):
65 self.deplacement=numpy.random.normal(0,5)
66 #On s'assure de rester dans l'image
67 if self.deplacement < -16: #Si on recule trop
68 self.deplacement = -16
69 if self.deplacement+self.largeur > 16: #Si on avance trop
70 self.deplacement=16-self.largeur
71 for i in xrange(0,self.largeur):
72 for j in xrange(0,31):
73 image[i+15+self.deplacement,j]=min(1,image[i+15+self.deplacement,j]+self.clarte)
74 return image
75
76 def _vertical(self,image):
77 self.deplacement=numpy.random.normal(0,5)
78 #On s'assure de rester dans l'image
79 if self.deplacement < -16: #Si on recule trop
80 self.deplacement = -16
81 if self.deplacement+self.largeur > 16: #Si on avance trop
82 self.deplacement=16-self.largeur
83 for i in xrange(0,self.largeur):
84 for j in xrange(0,31):
85 image[j,i+15+self.deplacement]=min(1,image[j,i+15+self.deplacement]+self.clarte)
86 return image
87
88 def _oblique(self,image):
89 decision=numpy.random.random()
90 D=numpy.zeros((32,32)) #La matrice qui sera additionnee
91 for i in xrange(int(-numpy.floor(self.largeur/2)),int(numpy.ceil((self.largeur+1)/2))):
92 D+=numpy.eye(32,32,i)
93 if decision<0.5: #On met tout sur l'anti-diagonale
94 D = D[:,::-1]
95 D*=self.clarte
96 image+=D
97 for i in xrange(0,32):
98 for j in xrange(0,32):
99 image[i,j]=min(1,image[i,j]) #Afin de toujours avoir des valeurs entre 0 et 1
100 return image
101
102
103 #---TESTS---
104
105 def _load_image():
106 f = open('/home/sylvain/Dropbox/Msc/IFT6266/donnees/lower_test_data.ft') #Le jeu de donnees est en local.
107 d = ft.read(f)
108 w=numpy.asarray(d[1])
109 return (w/255.0).astype('float')
110
111 def _test(complexite):
112 img=_load_image()
113 transfo = Rature()
114 pylab.imshow(img.reshape((32,32)))
115 pylab.show()
116 print transfo.get_settings_names()
117 print transfo.regenerate_parameters(complexite)
118 img=img.reshape((32,32))
119
120 img_trans=transfo.transform_image(img)
121
122 pylab.imshow(img_trans.reshape((32,32)))
123 pylab.show()
124
125
126 if __name__ == '__main__':
127 from pylearn.io import filetensor as ft
128 import pylab
129 _test(0.8)
130
131