view transformations/BruitGauss.py @ 41:fdb0e0870fb4

Beaucoup de modifications à pipeline.py pour généraliser et un début de visualisation, et créé un wrapper (run_pipeline.py) pour appeler avec GIMP. - Modifications à pipeline.py - Wrappé la boucle du pipeline dans une classe - Isolé le problème de itérer sur les batches et les complexités dans des itérateurs - Permet d'avoir des ordres compliqués de batch (plusieurs sources), de complexités - Maintenant regenerate_parameters() est appelé pour chaque image. - Command line arguments avec getopt(). On pourra rajouter des options ainsi. - run_pipeline.py - Le but est de permettre de passer des arguments. Pas facile (pas trouvé comment de façon simple) avec la command line pour appeler GIMP en mode batch. C'est un hack ici. - Le but ultime est de permettre de lancer les jobs sur les clusters avec dbidispatch en précisant les options (diff. pour chaque job) sur la ligne de commande.
author fsavard
date Wed, 03 Feb 2010 17:08:27 -0500
parents 349d8dc9504c
children bab98bb47616
line wrap: on
line source

#!/usr/bin/python
# coding: utf-8

'''
Ajout de bruit gaussien dans les donnees. Un bruit poivre et sel est ajoute
aux donnees, puis un filtre gaussien est applique sur l'image.

La proportion de bites aleatoires est definit par complexity.
Lorsque cette valeur est a 1 ==> Plus reconnaissable et 0 ==> Rien ne se passe

Le niveau de lisssage est definit par complexity
Au plus c'est eleve, au plus c'est lisse

Ce fichier prend pour acquis que les images sont donnees une a la fois
sous forme de numpy.array de 1024 (32 x 32) valeurs entre 0 et 1.

Sylvain Pannetier Lebeuf dans le cadre de IFT6266, hiver 2010

'''

import numpy
import random
import scipy
from scipy import ndimage

class BruitGauss():
    
    def __init__(self):
        self.proportion_bruit=0.1 #Le pourcentage des pixels qui seront bruites
        self.nb_chng=10 #Le nombre de pixels changes. Seulement pour fin de calcul
        self.sigma_gauss=0.5  #L'ecart type du noyau gaussien
        
    def get_settings_names(self):
        return ['proportion_bruit','sigma_gauss']

    def regenerate_parameters(self, complexity):
        self.proportion_bruit = complexity  #Generation uniforme
        self.nb_chng=int(1024*self.proportion_bruit)
        self.sigma_gauss=complexity+0.2
        return self._get_current_parameters()

    def _get_current_parameters(self):
        return []

    def get_parameters_determined_by_complexity(self, complexity):
        return [self.proportion_bruit,self.sigma_gauss]
    
    def transform_image(self, image):
        image=image.reshape(1024,1)
        changements=random.sample(xrange(numpy.size(image)),self.nb_chng)   #Les pixels qui seront changes
        for j in xrange(0,self.nb_chng):
            image[changements[j]]=numpy.random.random()    #On determine les nouvelles valeurs des pixels changes
        image=image.reshape(32,32)
        image=(scipy.ndimage.filters.gaussian_filter\
            (image, self.sigma_gauss, order=0, \
            output=None, mode='reflect', cval=0.0))
    
        return image

#---TESTS---

def _load_image():
    f = open('/home/sylvain/Dropbox/Msc/IFT6266/donnees/lower_test_data.ft')  #Le jeu de donnees est en local. 
    d = ft.read(f)
    w=numpy.asarray(d[0])
    return (w/255.0).astype('float')

def _test(complexite):
    img=_load_image()
    transfo = BruitGauss()
    pylab.imshow(img.reshape((32,32)))
    pylab.show()
    print transfo.get_settings_names()
    print transfo.regenerate_parameters(complexite)
    
    img_trans=transfo.transform_image(img)
    
    pylab.imshow(img_trans.reshape((32,32)))
    pylab.show()
    

if __name__ == '__main__':
    from pylearn.io import filetensor as ft
    import pylab
    _test(0.5)