view transformations/gimp_script.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 d511445f19da
children 7f5133e1fd23
line wrap: on
line source

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

'''
Filtres GIMP sous Python
Auteur: Nicolas Boulanger-Lewandowski
Date: Hiver 2010

run with:
gimp -i --batch-interpreter python-fu-eval --batch - < gimp_script.py

inclure pour terminer gimp à la fin du script:
pdb.gimp_quit(0)

Décommenter les lignes appropriées pour différents filtres
Les plug-ins de GIMP et leurs paramètres sont disponibles sous GIMP, menu Help > Plug-in Browser (toujours ignorer le paramètre run-mode).
Les autres fonctions du programme sont dans la Procedure DataBase (PDB) dans le menu Help > Procedure Browser.
'''

from gimpfu import *
import numpy

class GIMPTransformation():
    def __init__(self):
        self.img = gimp.Image(32, 32, GRAY)
        self.img.disable_undo()
        self.layer1 = gimp.Layer(self.img, "layer1", 32, 32, GRAY_IMAGE, 100, NORMAL_MODE)
        self.img.add_layer(self.layer1, 0)
        self.dest_rgn = self.layer1.get_pixel_rgn(0, 0, 32, 32, True)

    def transform_image(self, image):
        ''' si la ligne suivante échoue, upgrader à GIMP v.2.6.7
        OU utiliser une des 2 versions commentées ci-après (10x plus lent) '''
        self.dest_rgn[:,:] = (image.T*255).astype(numpy.uint8).tostring()

        #for i in range(32):
        # self.dest_rgn[i,:] = (image[i,:]*255).astype(numpy.uint8).tostring()

        #for i in range(32):
        # for j in range(32):
        #  self.dest_rgn[i,j] = chr(int((image[i,j] *255)))

        self.layer1.flush()
        self.layer1.update(0, 0, 32, 32)

        ''' application des filtres '''
        #pdb.plug_in_noisify(self.img, self.layer1, 0, 0.4, 0, 0, 0)
        #pdb.plug_in_c_astretch(self.img, self.layer1)
        #pdb.plug_in_emboss(self.img, self.layer1, 10, 30, 5, 0)
        #pdb.plug_in_applylens(self.img, self.layer1, 2, 1, 0, 0)
        #pdb.plug_in_blur(self.img, self.layer1)
        pdb.plug_in_gauss_rle(self.img, self.layer1, 9, 1, 0)

        ''' si la ligne suivante échoue, upgrader à GIMP v.2.6.7
        OU utiliser la version commentée ci-après (10x plus lent) '''
        image = numpy.fromstring(self.dest_rgn[:,:], 'UInt8').reshape((32,32)).T / 255.0

        #image = image*0
        #for i in range(32):
        # for j in range(32):
        #  image[i,j] = ord(self.dest_rgn[i,j]) /255.0
        
        return image

# TEST
if 1:
    im = numpy.zeros((32,32))
    for i in range(32):
     for j in range(32):
      im[i,j] = i*j/(32.*32.)

    test = GIMPTransformation()
    #for i in range(100):
    im = test.transform_image(im)
    
    import pylab
    pylab.imshow(im)
    pylab.show()

    pdb.gimp_quit(0)