Subscribe RSS

Posts Tagged ‘clojure’

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: , , , , , , , ,

Fonction avec méta-données (Clojure). Représentation d’images #3

octobre 20th, 2009 by fmn | No Comments | Filed in Enseignement, Recherche

Résumé des épisodes précédents : une image est une fonction bornée qu’il est possible de représenter à l’aide d’une classe Java. L’écriture de cette classe passe par un grand nombre de lignes de code, même en Clojure. Explorons aujourd’hui la possibilité d’une façon plus canonique de faire la même chose.

Une fonction bornée est une fonction comportant une information supplémentaire : son domaine de définition. Clojure fournit un façon pratique d’ajouter des données : la méta-donnée (metadata). Une méta-donnée est une map de données qui peut être étendue à l’aide de la fonction with-meta. Tentons d’ajouter un domaine de définition à une fonction :

user> (defn indom? [dom pt]
        (let [[start end] dom
              [x y] pt]
          (and (>= x (first start))
               (<= x (first end))
               (>= y (second start))
               (<= y (second end)))))
#'user/indom?
user> (defn f [x y] (+ x y))
#'user/f
user> (def dom [[0 0] [4 4]])
#'user/dom
user> (def bf (with-meta f {:domain dom}))
java.lang.UnsupportedOperationException (NO_SOURCE_FILE:10)

(Lire la suite…)

Tags: , , ,

Représentation d’images (Clojure et Java) #2

octobre 14th, 2009 by fmn | No Comments | Filed in Enseignement, Recherche

La dernière fois j’avais montré comment représenter une image en tant qu’une fonction bornée (voir ce billet). La classe java était intégralement écrite en Clojure. Cette représentation correspond à la représentation mathématique d’une image, mais n’est pas très efficace. Habituellement une image est stockée sous forme d’un tableau à deux dimensions. Cette structure permet de courts temps d’accès aux pixels de l’image.

Ainsi dans la librairie ImageJ sous Java, une image est représentée par une classe abstraite : l’ImageProcessor. Quatre classe en héritent et propose une implémentation concrète : ByteProcessor, ShortProcessor, FloatProcessor et ColorProcessor (voir l’api pour plus de détails) Comme je l’avais déjà souligné, le défaut de ces structures de données est de ne pouvoir représenter des images avec des pixels de coordonnées négatives.

Nous allons donc coder une représentation d’image basée sur un ImageProcessor, mais autorisant l’emploi d’indices négatifs. La classe Image héritera de la classe précédente Imfun.

(Lire la suite…)

Tags: , , , , ,