view transformations/slant.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 0f1337994716
children
line wrap: on
line source

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

'''
Author: Youssouf

this module add a slant effect to the image. 

To obtain the slant effect, each row of the array is shifted proportionately by a step controlled by the complexity.

'''

import numpy


class Slant():
    def __init__(self, complexity=1):
        #---------- private attributes
        self.direction = 1
        self.angle = 0

        #---------- generation parameters
        self.regenerate_parameters(complexity)
        #------------------------------------------------
    
    def _get_current_parameters(self):
        return [self.angle, self.direction]
    
    def get_settings_names(self):
        return ['angle', 'direction']
    
    def regenerate_parameters(self, complexity):
        self.angle = numpy.random.uniform(0.0, complexity)
        P = numpy.random.uniform()
        self.direction = 1;
        if P < 0.5:
            self.direction = -1;
        return self._get_current_parameters()
    
    
    def transform_image(self,image):
        if self.angle == 0:
            return image
        
        ysize, xsize = image.shape
        slant = self.direction*self.angle

        output = image.copy()

        # shift all the rows
        for i in range(ysize):
            line = image[i]
            delta = round((i*slant)) % xsize
            line1 = line[:xsize-delta]
            line2 = line[xsize-delta:xsize]

            output[i][delta:xsize] = line1
            output[i][0:delta] = line2

            
        #correction to center the image
        correction = (self.direction)*round(self.angle*ysize/2)
        correction = (xsize - correction) % xsize

        # center the region
        line1 = output[0:ysize,0:xsize-correction].copy()
        line2 = output[0:ysize,xsize-correction:xsize].copy()
        output[0:ysize,correction:xsize] = line1
        output[0:ysize,0:correction] = line2


        return output
            

# Test function
# Load an image in local and create several samples of the effect on the
# original image with different parameter. All the samples are saved in a single image, the 1st image being the original.

def test_slant():
    import scipy
    img_name = "test_img/mnist_0.png"
    dest_img_name = "test_img/slanted.png"
    nb_samples = 10
    im = Image.open(img_name)
    im = im.convert("L")
    image = numpy.asarray(im)

    image_final = image
    slant = Slant()	
    for i in range(nb_samples):
        slant.regenerate_parameters(1)
        image_slant = slant.transform_image(image)
        image_final = scipy.hstack((image_final,image_slant))

    im = Image.fromarray(image_final.astype('uint8'), "L")
    im.save(dest_img_name)

# Test
if __name__ == '__main__':  
    import sys, os, fnmatch
    import Image

    test_slant()