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