diff 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
line wrap: on
line diff
--- a/transformations/Rature.py	Sun Feb 07 23:29:05 2010 -0500
+++ b/transformations/Rature.py	Mon Feb 08 13:57:46 2010 -0500
@@ -6,7 +6,8 @@
 (dans ces deux cas, l'amplacement de la bande est aleatoire) ou sur la diagonale
 (et anti-diagonale).
 
-La largeur de la bande ainsi que sa clarté sont definies a l'aide de complexity.
+La largeur de la bande ainsi que sa clarté sont definies a l'aide de complexity
+et d'une composante aleatoire.
 clarte: 0=blanc et 1=noir
 
 Ce fichier prend pour acquis que les images sont donnees une a la fois
@@ -25,10 +26,11 @@
         self.largeur=2  #Largeur de la bande
         self.deplacement=0  #Deplacement par rapport au milieu
         self.orientation=0  #0=horizontal, 1=vertical, 2=oblique
-        self.clarte=0.5
+        self.clarte=0.5 #Clarte de la ligne appliquee
+        self.faire=1  #Si ==1, on applique une rature
 
     def get_settings_names(self):
-        return ['orientation','deplacement','clarte']
+        return ['orientation','deplacement','clarte','faire']
 
     def regenerate_parameters(self, complexity):
         #Il faut choisir parmis vertical, horizontal et diagonal.
@@ -44,16 +46,19 @@
         else:
             self.orientation=2
             
-        self.largeur=int(numpy.ceil(complexity*5))
-        self.clarte=complexity
-        
+        self.largeur=min(32,max(1,int(numpy.ceil(complexity*5)*numpy.random.normal(1,float(complexity)/2))))
+        self.clarte=min(1,max(0,complexity*numpy.random.normal(1,float(complexity)/2)))
+        self.faire=numpy.random.binomial(1,float(complexity))
         
         return self._get_current_parameters()
 
     def _get_current_parameters(self):
-        return [self.orientation,self.largeur,self.clarte]
+        return [self.orientation,self.largeur,self.clarte,self.faire]
 
     def transform_image(self, image):
+        if self.faire == 0:
+            return image
+        
         if self.orientation == 0:
             return self._horizontal(image)
         elif self.orientation == 1:
@@ -69,8 +74,8 @@
         if self.deplacement+self.largeur > 16: #Si on avance trop
             self.deplacement=16-self.largeur
         for i in xrange(0,self.largeur):
-            for j in xrange(0,31):
-                image[i+15+self.deplacement,j]=min(1,image[i+15+self.deplacement,j]+self.clarte)
+            for j in xrange(0,32):
+                image[i+15+self.deplacement,j]=min(1,max(image[i+15+self.deplacement,j],self.clarte))
         return image
     
     def _vertical(self,image):
@@ -81,8 +86,8 @@
         if self.deplacement+self.largeur > 16: #Si on avance trop
             self.deplacement=16-self.largeur
         for i in xrange(0,self.largeur):
-            for j in xrange(0,31):
-                image[j,i+15+self.deplacement]=min(1,image[j,i+15+self.deplacement]+self.clarte)
+            for j in xrange(0,32):
+                image[j,i+15+self.deplacement]=min(1,max(image[j,i+15+self.deplacement],self.clarte))
         return image
     
     def _oblique(self,image):
@@ -93,10 +98,9 @@
         if decision<0.5: #On met tout sur l'anti-diagonale
             D = D[:,::-1]
         D*=self.clarte
-        image+=D
         for i in xrange(0,32):
             for j in xrange(0,32):
-                image[i,j]=min(1,image[i,j])  #Afin de toujours avoir des valeurs entre 0 et 1    
+                image[i,j]=min(1,max(image[i,j],D[i,j])) 
         return image