Traitement d´images en Java avec JAI
L´imagerie en Java
Définition d´une image
Une image désigne un élément visuel arbitraire. Il peut représenter des éléments concrets du monde extérieur ou des éléments abstraits.
Informatiquement, une image est une structure visuelle constituée d´une ensemble de points appelés pixel (pour pictures elements). Chaque pixel est représénté par une couleur. On qualifie une image par sa résolution qui permet de définir sa taille en multipliant son nombre de pixels en largeur par son nombre de pixels en hauteur. On peut ici faire un parallèle avec les appareils photos numériques qui sont classés selon la définition des images qu´ils produisent : par exemple un appareil 1,2 méga pixel produira des images d´une définition de 1280 pixels en largeur et 1024 pixels en hauteur.
Représentation en Java
Historiquement, en Java 1.0, une image était représenté par la classe abstraite Image. Cette abstraction ne permettait pas d´accéder finement aux pixels de l´image et donc ne fournissait aucune possibilitée pour faire des traitement prés.
La sortie de Java2 avec Java2D corrige cette lacune en ajoutant l´interface RenderedImage et la classe BufferedImage qui l´implémente. Cette classe permet de récupérer les données pixel par pixel ainsi que de modifier le contenu de chaque pixel. Une BufferedImage ne contient pas les données mais elle se compose de sous éléments définissant l´ensemble des parties de l´image qui sont détaillés ici :
On distingue les deux principaux éléments contenus dans l´image :
- Le Raster représente les données physiques de l´image. Il est lui aussi subdivisé en deux éléments :
- Le DataBuffer contient les données brut de l´image sous la forme d´un tableau
- Le SampleModel permet d´extraire la valeur d´un ou plusieurs pixels (nommés Samples) du DataBuffer.
- Le ColorModel permet de faire le lien entre la valeur numéque d´un pixel et la couleur qu´il représente.
Java Advanced Imaging
L´introduction de Java2D ajoutait à java des possibilités vastes pour le traitement d´images mais une partie de l´industrie n´a pas considéré ces possibilités comme suffisantes. Il a donc été décidé de créer une nouvelle API compatible avec Java2D mais étendant les possibilités offertes par celle-ci.
Java Advanced Imaging, ou plus simplement nommé JAI, est ainsi compatible avec le coeur de Java en reprenant les mêmes interfaces et classes dès que possible. Ainsi, JAI redéfinit ses propres classes représentant une image, mais continue d´utiliser les classes ColorModel, SampleModel et l´interface RenderedImage. Cela permet de pouvoir indépendemment remplacer les images Java2D par celles définit par JAI.
JAI apporte les avantages suivants par rapport à Java2D :
- De meilleures performances par l´utilisation du système pour les traitements (par appel de code compilé pour la plateforme à l´aide de JNI)
- La séparation des images en plusieurs zones (Tiles) en utilisant la classe TiledImage qui est le pendant JAI de la classe BufferedImage
- La prise en charge de régions d´intérets (ROI) afin de n´effectuer des traitements que sur une région précise de l´image
Un ensemble de filtres de traitements d´images sont fournis avec JAI ainsi que la possibilité de créer ses propres filtres.
la partie suivante va nous permettre de détailler les principaux traitements qui sont effectués sur une image ainsi que les filtres que JAI propose pour effectuer ces traitements.