view transformations/add_background_image.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 4d4248f7e2fb
children ab70fbca513c
line wrap: on
line source

#!/usr/bin/python                                                                                 
# -*- coding: iso-8859-1 -*-                                                                      

'''
    Implementation of random background adding to a specific image

    Author: Guillaume Sicard
'''

import sys, os, random, fnmatch
import Image, numpy           

class AddBackground():
    def __init__(self, threshold = 128):
        self.h = 32
        self.w = 32
        self.threshold = threshold;
        self.bg_image_dir = './images/'
        self.pattern = '*.jpg'

    # get threshold value
    def get_settings_names(self):
        return [str(self.threshold)]

    # no need, except for testmod.py
    def regenerate_parameters(self, complexity):
        value = random.gauss(0, 0.5*complexity)
        return [value]

    # load an image
    def load_image(self,filename):
        image = Image.open(filename).convert('L')
        image = numpy.asarray(image)
        image = (image / 255.0).astype(numpy.float32)
        return image

    # save an image
    def save_image(self,array, filename):
        image = (array * 255.0).astype('int')
        image = Image.fromarray(image)
        if (filename != ''):
            image.save(filename)
        else:
            image.show()

    # make a random 32x32 crop of an image
    def rand_crop(self,image):
        i_w, i_h = image.shape
        x, y = random.randint(0, i_w - self.w), random.randint(0, i_h - self.h)
        return image[x:x + self.w, y:y + self.h]

    # select a random background image from "bg_image_dir" and crops it
    def rand_bg_image(self):
        files = os.listdir(self.bg_image_dir)
        image_files = fnmatch.filter(files, self.pattern)
        i = random.randint(0, len(image_files) - 1)

        image = self.load_image(self.bg_image_dir + image_files[i])
        self.bg_image = self.rand_crop(image)

    # set "bg_image" as background to "image", based on a pixels threshold
    def set_bg(self,image):
        b = (image < self.threshold / 255.0).astype(numpy.float32)
        return b * self.bg_image + ( 1 - b) * image

    # transform an image file and return an array
    def transform_image_from_file(self, filename):
        self.rand_bg_image()
        image = self.load_image(filename)
        image = self.set_bg(image)
        return image

    # standard array to array transform
    def transform_image(self, image):
        self.rand_bg_image()
        image = self.set_bg(image)
        return image

    # test method
    def test(self,filename):
        import time

        sys.stdout.write('Starting addBackground test : loading image')
        sys.stdout.flush()

        image = self.load_image(filename)

        t = 0
        n = 500
        for i in range(n):
            t0 =  time.time()
            image2 = self.transform_image(image)
            t = ( i * t + (time.time() - t0) ) / (i + 1)
            sys.stdout.write('.')
            sys.stdout.flush()
            
        print "Done!\nAverage time : " + str(1000 * t) + " ms"

if __name__ == '__main__':

    myAddBackground = AddBackground()
    myAddBackground.test('./images/0-LiberationSans-Italic.ttf.jpg')