diff transformations/Occlusion.py @ 74:f3e4328e3514

Contraste entre image et bruit renforce et proba 0.2 d'effectuer l'occlusion
author SylvainPL <sylvain.pannetier.lebeuf@umontreal.ca>
date Wed, 10 Feb 2010 14:03:50 -0500
parents 27bf31dca87d
children 5d22498c73d1
line wrap: on
line diff
--- a/transformations/Occlusion.py	Wed Feb 10 13:02:05 2010 -0500
+++ b/transformations/Occlusion.py	Wed Feb 10 14:03:50 2010 -0500
@@ -8,9 +8,10 @@
 gauche ou a droite de l'image originale. De plus, il se peut aussi que le
 bruit soit rajoute sur l'image originale, mais en plus pâle.
 
-Il faut s'assurer d'avoir le fichier echantillon_occlusion.ft (voir "files" sur assembla) 
-dans le repertoire ou est effectuee l'execution de Occlusion.py. Sinon, 
-simplement changer le "path" sur la ligne 46
+Le fichier /data/lisa/data/ift6266h10/echantillon_occlusion.ft 
+(sur le reseau DIRO) est necessaire.
+
+Il y a 20% de chance d'avoir une occlusion quelconque.
 
 Sylvain Pannetier Lebeuf dans le cadre de IFT6266, hiver 2010
 
@@ -18,8 +19,7 @@
 
 
 import numpy
-import scipy
-import pylab
+
 from pylearn.io import filetensor as ft
 
 class Occlusion():
@@ -44,7 +44,11 @@
         #Cette variable determine l'opacite de l'ajout dans le cas ou on est au milieu
         self.opacite=0.5    #C'est completement arbitraire. Possible de le changer si voulu
         
+        #Sert a dire si on fait quelque chose. 0=faire rien, 1 on fait quelque chose
+        self.appliquer=1
+        
         f3 = open('/data/lisa/data/ift6266h10/echantillon_occlusion.ft')   #Doit etre sur le reseau DIRO.
+        #f3 = open('/home/sylvain/Dropbox/Msc/IFT6266/donnees/echantillon_occlusion.ft')
         #Il faut arranger le path sinon
         w=ft.read(f3)
         f3.close()
@@ -54,7 +58,7 @@
         
         
     def get_settings_names(self):
-        return ['haut','bas','gauche','droite','x_arrivee','y_arrivee','endroit','rajout']
+        return ['haut','bas','gauche','droite','x_arrivee','y_arrivee','endroit','rajout','appliquer']
 
     def regenerate_parameters(self, complexity):
         self.haut=min(15,int(numpy.abs(numpy.random.normal(int(7*complexity),2))))
@@ -72,16 +76,23 @@
         self.y_arrivee=int(numpy.random.normal(0,3)) 
         
         self.rajout=numpy.random.randint(0,self.longueur)  #les bouts de quelle lettre
+        self.appliquer=numpy.random.binomial(1,0.2)    #####  20 % du temps, on met une occlusion #####
+        
+        if complexity == 0: #On ne fait rien dans ce cas
+            self.applique=0
         
         self.endroit=numpy.random.randint(-1,2) 
-        #####Revoir si ces trois dernieres variables sont determinees ici !
+
         return self._get_current_parameters()
 
     def _get_current_parameters(self):
-        return [self.haut,self.bas,self.gauche,self.droite,self.x_arrivee,self.y_arrivee,self.endroit,self.rajout]
+        return [self.haut,self.bas,self.gauche,self.droite,self.x_arrivee,self.y_arrivee,self.endroit,self.rajout,self.appliquer]
     
     
     def transform_image(self, image):
+        if self.appliquer == 0: #Si on fait rien, on retourne tout de suite l'image
+            return image
+        
         #Attrapper le bruit d'occlusion
         bruit=self.d[self.rajout].reshape((32,32))[15-self.haut:15+self.bas+1,15-self.gauche:15+self.droite+1]
         
@@ -94,18 +105,22 @@
             self.y_arrivee=15-self.bas  #On colle le morceau en bas
             
         if self.endroit==-1:    #a gauche
-            image[(16+self.y_arrivee-self.haut):(16+self.y_arrivee+self.bas+1),(self.x_arrivee):(self.x_arrivee+self.gauche+self.droite+1)]=image[(16+self.y_arrivee-self.haut):(16+self.y_arrivee+self.bas+1),(self.x_arrivee):(self.x_arrivee+self.gauche+self.droite+1)]+bruit
-        
+            for i in xrange(-self.haut,self.bas+1):
+                for j in xrange(0,self.gauche+self.droite+1):
+                    image[16+self.y_arrivee+i,self.x_arrivee+j]=\
+                    max(image[16+self.y_arrivee+i,self.x_arrivee+j],bruit[i+self.haut,j])
+            
         elif self.endroit==1: #a droite
-            image[(16+self.y_arrivee-self.haut):(16+self.y_arrivee+self.bas+1),(31-self.x_arrivee-self.gauche-self.droite):(31-self.x_arrivee+1)]=image[(16+self.y_arrivee-self.haut):(16+self.y_arrivee+self.bas+1),(31-self.x_arrivee-self.gauche-self.droite):(31-self.x_arrivee+1)]+bruit
-        
+            for i in xrange(-self.haut,self.bas+1):
+                for j in xrange(-self.gauche-self.droite,1):
+                    image[16+self.y_arrivee+i,31-self.x_arrivee+j]=\
+                    max(image[16+self.y_arrivee+i,31-self.x_arrivee+j],bruit[i+self.haut,j+self.gauche+self.droite])
+            
         elif self.endroit==0:    #au milieu
-            image[(16-self.haut):(16+self.bas+1),(16-self.gauche):(16+self.droite+1)]=image[(16-self.haut):(16+self.bas+1),(16-self.gauche):(16+self.droite+1)]+(bruit*self.opacite)
-        
-        #renormaliser le tout. Toutes les entrees doivent etre entre 0 et 1
-        for ii in xrange(0,32):
-            for jj in xrange(0,32):
-                image[ii,jj]=min(1,image[ii,jj])
+            for i in xrange(-self.haut,self.bas+1):
+                for j in xrange(-self.gauche,self.droite+1):
+                    image[16+i,16+j]=max(image[16+i,16+j],bruit[i+self.haut,j+self.gauche]*self.opacite)
+            
         
         return image
         
@@ -135,4 +150,5 @@
 
 if __name__ == '__main__':
     import pylab
+    import scipy
     _test(0.5)
\ No newline at end of file