Subscribe RSS

Posts Tagged ‘tutoriel’

Plugin ImageJ minimal en Clojure: inverser une image

janvier 15th, 2010 by fmn | 3 Comments | Filed in Enseignement, Recherche

Je présente ici comment écrire un plugin pour ImageJ avec Clojure. L’exemple est tiré de Digital Image Processing: An Algorithmic Introduction Using Java: l’inversion d’une image (page 32).

Il s’agit d’inverser tous les pixels d’une image codée en niveaux de gris, sur 8 bits, transformant ainsi une image en son négatif. Puisqu’un pixel est codé sur 8 bits, la valeur maximale possible est 255. Il faut donc transformer tout les pixels v de l’image en 255-v.

Je commence par présenter le code Java, décrivant ainsi les éléments nécessaires à un plugin ImageJ. Puis plusieurs versions Clojure sont données. La dernière version est aussi rapide que le code Java, et pourtant plus réutilisable.

(Lire la suite…)

Tags: , , , , , , , ,

Illustration de la distance de Hausdorff

décembre 17th, 2009 by fmn | 2 Comments | Filed in Recherche

    C’est moche, c’est normal c’est la version 0.1 de la démonstration de la distance de Hausdorff. En préparation d’un billet sur cette distance, je suis prépare une vidéo censée aider à comprendre son fonctionnement. Voici une première version, obtenue avec clojure et ImageJ.

    Je viens de me rendre compte que les annotations ne sont visibles que sur Youtube. Vous pouvez voir la vidéo complète ici.

    Le principe  : une distance entre deux ensembles (ici de points) A et B. En trois étapes :

    1. distance de A à B : pour chaque point de A, est retenu le point de B le plus proche. De toutes ces distances, on garde la plus grande.
    2. distance de B à A : idem.
    3. de ces deux distances (qui apparaissent fléchées à la fin de la vidéo), on garde la plus grande.

    J’attend les critiques…

    FMN.

    Tags: , ,

    Utiliser ImageJ dans un notebook Sage, un exemple d’appel de Java depuis Python

    novembre 10th, 2009 by fmn | 12 Comments | Filed in Enseignement, Recherche
    Sage est un logiciel formidable : un grand ensemble de langages et de librairies de mathématiques, avec Python pour faire la glue. Tout cela est assez remarquable, mais j’utilise beaucoup Java pour développer mes applications de traitement et d’analyse d’images. En particulier j’exploite la plateforme ImageJ qui permet de construire des plugins assez facilement distribuables. Il s’agit donc de pouvoir utiliser (facilement) une librairie Java avec Python, donc Sage. La méthode complète est décrite dans ce billet, permettant d’exploiter ImageJ dans Sage.
    Comme Sage s’appuie sur Python, il suffit de trouver une méthode pour appeler du code Java depuis Python. Plusieurs solutions existent (si j’exclue les trucs bricolables avec du RMI):
    • Javaclass : pas réussi à le faire fonctionner. Le passage de valeurs me semblant de toute façon nécessiter du travail.
    • JCC : un peu lourd à mettre en place, en particulier le nécessité d’ajouter des options longues comme le bras au lancement de python.
    • JPype : le plus simple, se présentant comme un module python et d’une utilisation très aisée.

    Installation de JPype

    L’installation de JPype est assez classique :

    unzip JPype-0.5.4.1.zip
    cd JPype-0.5.4.1
    sage -python setup.py build

    Ici cela peut coincer car JPype utilise le module sets qui n’est plus inclu dans les versions récentes de python. Il n’y a pas beaucoup de modifications à apporter. Vous pouvez télécharger la version modifiée. Attention il faut tout de même suivre les instructions données dans le README.TXT pour donner le chemin vers votre installation JDK. Si la compilation se passe bien (sinon m’envoyer un mail), il suffit d’installer le module :

    sage -python setup.py install

    Maintenant nous allons travailler dans un notebook Sage (téléchargeable ici).

    Utilisation de JPype

    C’est assez direct :

    1. importer le module,
    2. lancer la machine virtuelle,
    3. importer un ou plusieurs packages java.

    from jpype import *
    startJVM(‘/usr/lib/jvm/java-6-openjdk/jre/lib/i386/client/libjvm.so’, ‘-Djava.class.path=/home/fredn/.libjar/ij.jar’)
    ij = JPackage(‘ij’)

    Le premier paramètre de startJVM() est le chemin vers la librairie dynamique de la machine virtuelle. Pour la trouver, faire

    locate libjvm.so

    Le second paramètre permet d’étendre le classpath pour ajouter des librairies, ici ImageJ.

    L‘ensemble des méthodes du package java ij sont maintenant accessible, directement. Récupérons une image et affichons la dans le notebook :

    im = ij.IJ.openImage(“http://rsb.info.nih.gov/ij/images/lena.jpg”)
    ij.IJ.save(im, os.getcwd()+’/tmp.png’)

    JPype permet de passer des objets java en objets python très facilement (et vis versa). Ainsi un objet python à créé à partir d’un objet java, avec toutes les méthodes de cet objet :

    lena = ij.IJ.openImage(“http://rsb.info.nih.gov/ij/images/lena.jpg”).getProcessor().convertToByte(True)
    lena
    <jpype._jclass.ij.process.ByteProcessor object at 0xb7ad52c>
    <jpype._jclass.ij.process.ByteProcessor object at 0xb7ad52c>

    Je peux maintenant m’amuser à trouver les contours de Lena en appelant une méthode du ByteProcessor :

    lenaedges = lena.duplicate()
    lenaedges.findEdges()
    lenaedges
    <jpype._jclass.ij.process.ByteProcessor object at 0xb313652c>
    <jpype._jclass.ij.process.ByteProcessor object at 0xb313652c>

    Si je souhaite afficher cote à cote Lena et ses contours, je peux récupérer le tableau des pixels de chaque ImageProcessor en appelant la méthode getIntArrray().

    lenaedges.getIntArray()
    <jpype._jarray.int[][] object at 0xb313a20c>
    <jpype._jarray.int[][] object at 0xb313a20c>

    L’objet renvoyé est un objet indexable en Python, je peux donc directement le passer à des fonctions python pour afficher mes images. La conversion des types primitifs étant réalisée implicitement par JPype :

    import pylab as pl
    pl.gray()
    pl.figure()
    pl.subplot(1,2,1)
    pl.imshow(lena.getIntArray())
    pl.subplot(1,2,2)
    pl.imshow(lenaedges.getIntArray())
    pl.savefig(‘tmp.png’)

    Tags: , , , , , , ,