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