# HG changeset patch # User SylvainPL # Date 1265828630 18000 # Node ID f3e4328e35147cdeef360df9886685c5ede3f89b # Parent 859ebd7f87549be0e18cc6b7ab7b3d7b4ca34299 Contraste entre image et bruit renforce et proba 0.2 d'effectuer l'occlusion diff -r 859ebd7f8754 -r f3e4328e3514 transformations/Occlusion.py --- 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