Mercurial > ift6266
comparison transformations/Rature.py @ 58:fd02fd7e6557
Contraste de rature plus prononce, il y a maintenant rature avec proba=complexity, la clarte et la largeur de la bande ont maintenant une composante aleatoire
author | SylvainPL <sylvain.pannetier.lebeuf@umontreal.ca> |
---|---|
date | Mon, 08 Feb 2010 13:57:46 -0500 |
parents | 5848e88f7a7a |
children | 7949f46b03e0 |
comparison
equal
deleted
inserted
replaced
57:6846136b2201 | 58:fd02fd7e6557 |
---|---|
4 ''' | 4 ''' |
5 Ajout de rature sur le caractère. La rature peut etre horizontale, verticale | 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 | 6 (dans ces deux cas, l'amplacement de la bande est aleatoire) ou sur la diagonale |
7 (et anti-diagonale). | 7 (et anti-diagonale). |
8 | 8 |
9 La largeur de la bande ainsi que sa clarté sont definies a l'aide de complexity. | 9 La largeur de la bande ainsi que sa clarté sont definies a l'aide de complexity |
10 et d'une composante aleatoire. | |
10 clarte: 0=blanc et 1=noir | 11 clarte: 0=blanc et 1=noir |
11 | 12 |
12 Ce fichier prend pour acquis que les images sont donnees une a la fois | 13 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 sous forme de numpy.array de 1024 (32 x 32) valeurs entre 0 et 1. |
14 | 15 |
23 | 24 |
24 def __init__(self): | 25 def __init__(self): |
25 self.largeur=2 #Largeur de la bande | 26 self.largeur=2 #Largeur de la bande |
26 self.deplacement=0 #Deplacement par rapport au milieu | 27 self.deplacement=0 #Deplacement par rapport au milieu |
27 self.orientation=0 #0=horizontal, 1=vertical, 2=oblique | 28 self.orientation=0 #0=horizontal, 1=vertical, 2=oblique |
28 self.clarte=0.5 | 29 self.clarte=0.5 #Clarte de la ligne appliquee |
30 self.faire=1 #Si ==1, on applique une rature | |
29 | 31 |
30 def get_settings_names(self): | 32 def get_settings_names(self): |
31 return ['orientation','deplacement','clarte'] | 33 return ['orientation','deplacement','clarte','faire'] |
32 | 34 |
33 def regenerate_parameters(self, complexity): | 35 def regenerate_parameters(self, complexity): |
34 #Il faut choisir parmis vertical, horizontal et diagonal. | 36 #Il faut choisir parmis vertical, horizontal et diagonal. |
35 #La methode n'est pas exacte, mais un peu plus rapide que generer un int. | 37 #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 | 38 #Complexity n'a rien a voir avec ce choix |
42 elif choix <0.67: | 44 elif choix <0.67: |
43 self.orientation=1 | 45 self.orientation=1 |
44 else: | 46 else: |
45 self.orientation=2 | 47 self.orientation=2 |
46 | 48 |
47 self.largeur=int(numpy.ceil(complexity*5)) | 49 self.largeur=min(32,max(1,int(numpy.ceil(complexity*5)*numpy.random.normal(1,float(complexity)/2)))) |
48 self.clarte=complexity | 50 self.clarte=min(1,max(0,complexity*numpy.random.normal(1,float(complexity)/2))) |
49 | 51 self.faire=numpy.random.binomial(1,float(complexity)) |
50 | 52 |
51 return self._get_current_parameters() | 53 return self._get_current_parameters() |
52 | 54 |
53 def _get_current_parameters(self): | 55 def _get_current_parameters(self): |
54 return [self.orientation,self.largeur,self.clarte] | 56 return [self.orientation,self.largeur,self.clarte,self.faire] |
55 | 57 |
56 def transform_image(self, image): | 58 def transform_image(self, image): |
59 if self.faire == 0: | |
60 return image | |
61 | |
57 if self.orientation == 0: | 62 if self.orientation == 0: |
58 return self._horizontal(image) | 63 return self._horizontal(image) |
59 elif self.orientation == 1: | 64 elif self.orientation == 1: |
60 return self._vertical(image) | 65 return self._vertical(image) |
61 else: | 66 else: |
67 if self.deplacement < -16: #Si on recule trop | 72 if self.deplacement < -16: #Si on recule trop |
68 self.deplacement = -16 | 73 self.deplacement = -16 |
69 if self.deplacement+self.largeur > 16: #Si on avance trop | 74 if self.deplacement+self.largeur > 16: #Si on avance trop |
70 self.deplacement=16-self.largeur | 75 self.deplacement=16-self.largeur |
71 for i in xrange(0,self.largeur): | 76 for i in xrange(0,self.largeur): |
72 for j in xrange(0,31): | 77 for j in xrange(0,32): |
73 image[i+15+self.deplacement,j]=min(1,image[i+15+self.deplacement,j]+self.clarte) | 78 image[i+15+self.deplacement,j]=min(1,max(image[i+15+self.deplacement,j],self.clarte)) |
74 return image | 79 return image |
75 | 80 |
76 def _vertical(self,image): | 81 def _vertical(self,image): |
77 self.deplacement=numpy.random.normal(0,5) | 82 self.deplacement=numpy.random.normal(0,5) |
78 #On s'assure de rester dans l'image | 83 #On s'assure de rester dans l'image |
79 if self.deplacement < -16: #Si on recule trop | 84 if self.deplacement < -16: #Si on recule trop |
80 self.deplacement = -16 | 85 self.deplacement = -16 |
81 if self.deplacement+self.largeur > 16: #Si on avance trop | 86 if self.deplacement+self.largeur > 16: #Si on avance trop |
82 self.deplacement=16-self.largeur | 87 self.deplacement=16-self.largeur |
83 for i in xrange(0,self.largeur): | 88 for i in xrange(0,self.largeur): |
84 for j in xrange(0,31): | 89 for j in xrange(0,32): |
85 image[j,i+15+self.deplacement]=min(1,image[j,i+15+self.deplacement]+self.clarte) | 90 image[j,i+15+self.deplacement]=min(1,max(image[j,i+15+self.deplacement],self.clarte)) |
86 return image | 91 return image |
87 | 92 |
88 def _oblique(self,image): | 93 def _oblique(self,image): |
89 decision=numpy.random.random() | 94 decision=numpy.random.random() |
90 D=numpy.zeros((32,32)) #La matrice qui sera additionnee | 95 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))): | 96 for i in xrange(int(-numpy.floor(self.largeur/2)),int(numpy.ceil((self.largeur+1)/2))): |
92 D+=numpy.eye(32,32,i) | 97 D+=numpy.eye(32,32,i) |
93 if decision<0.5: #On met tout sur l'anti-diagonale | 98 if decision<0.5: #On met tout sur l'anti-diagonale |
94 D = D[:,::-1] | 99 D = D[:,::-1] |
95 D*=self.clarte | 100 D*=self.clarte |
96 image+=D | |
97 for i in xrange(0,32): | 101 for i in xrange(0,32): |
98 for j in xrange(0,32): | 102 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 | 103 image[i,j]=min(1,max(image[i,j],D[i,j])) |
100 return image | 104 return image |
101 | 105 |
102 | 106 |
103 #---TESTS--- | 107 #---TESTS--- |
104 | 108 |