1 Prémiminaires tiilab : Les formats et les programmes Version β du 21 août 2015 Dans l équipe TII, la manipulation d images de toutes sortes et de tout format a toujours été une étape fastidieuse et requise pour effectuer des traitements numériques, aussi bien pour lire (et découper) des images de diverses sources (agences spatiales, partenaires industriels,...) que pour archiver des données traitées. Aussi, dès l origine du traitement d images numériques à Télécom ParisTech, une philosophie (copiée d ailleurs par bien d industriels) s est dégagée et consiste à archiver les données image en deux fichiers: le premier, d extension.ima, renferme les données au format machine dans l ordre d un balayage vidéo (ou celui d une bande magnétique), le second, en ASCII et donc lisible et modifiable par n importe quel éditeur, d extension.dim, renferme les informations sur l image réduites au strict minimum (c est à dire le nombre de colonne et le nombre de lignes, soit deux paramètres). Ce format historique a évolué, en particulier pour suivre les évolutions des acquisitions en imagerie médicale (systèmes volumiques,...) et en imagerie radar (données sur 16bits, en demi-float, en float, en complexe,...). Pour l imagerie médicale, les évolutions ont conduit au format Tivoli (Traitement d Images VOLumIques). Par quelques légères modifications du fichier.dim, il est alors possible de traiter des données multicoupes (troisième paramètre) et multitemporelles (quatrième paramètre), ainsi que divers format (données sur 16bits, 32 bits, en float, en double) ainsi que l endian des données. Le nom du fichier binaire de l image a toujorus l extension.dim. Pour l imagerie radar, longtemps limitée à des images uniques sur un site donné, les priorités ont conduit à modifier l extension pour reconnaître le type de données (réelles ou complexes) et l endian (l extension de l image est en minuscule pour les données archivées sur SUN et en majuscule pour les données archivées sur PC) : le fichier.dim est alors réduit à sa pls simple expression (le nombre de colonnes et le nombre de lignes). Ensuite, pour pouvoir traiter de données multitemporelles, le format a été rendu Tivolicompatible tout en ajoutant les types de données spécifiques à l imagerie radar. L idée essentielle est que la donnée image est un fichier dont on ne modifie pas le contenu, et que, en revanche, le fichier.dim peut être édité (avec n importe quel éditeur puisqu il est en ASCII) selon les besoins : il est par exemple très facile d écrire un.dim correspondant à une image 16 bits radar et de modifier l extension de cette image pour la rendre Tivoli-lisible. Pour simplifier le problème de lecture d images Tivoli/Xima, des outils élémentaires sont proposés dans divers langages actuels : Matlab : voir le paragraphe 3.1 Scilab : voir le paragraphe 3.2 Python : voir le paragraphe 3.3 C : voir le paragraphe 3.4 Java : voir le paragraphe 3.5 A chaque fois, des procédures/méthodes élémentaires sont proposées et un exemple est donné. L utilisateur pourra ainsi s inspirer des codes proposés pour l adapter éventuellement à son problème. Dernier point : les radaristes de Télécom-ParisTech utilisent un visualiseur d images appelé xima quasiment Tivoli-compatible : tous les types d images décrits dans ce document sont visualisables par xima, seule une fonctionnalité concernant le quatrième paramètre est manquant 1. 2 Les formats 2.1 Images monocanal C est le cas le plus classique : à un pixel correspond une valeur unique réelle. 1. Il est cependant facile de modifier les troisième et quatrième paramètres pour permettre la lecture de la totalité de l image. 1
type xima Tivoli Matlab fread Scilab Python extension -type -type -bo type machine mget unpack unsigned char.ima U8 U8 uint8 uc B unsigned short.imw U16 U16 SUN uint16 b usb >H.IMW U16 U16 DEC uint16 l usl <H signed short.ims S16 S16 SUN int16 b sb >h.ims S16 S16 DEC int16 l sl <h unsigned integer U32 SUN uint32 b U32 DEC uint32 l signed integer.iml S32 SUN int32 b ib >i.iml S32 DEC int32 l il <i float.imf FLOAT FLOAT SUN float b fb >f.imf FLOAT FLOAT DEC float l fl <f double.imd DOUBLE DOUBLE SUN float64 b db >d double.imd DOUBLE DOUBLE DEC float64 l dl <d Au sujet du type de plateforme, xima utilise une extension en minuscule pour les plateformes big endian (Sun) et en majuscule pour les plateformes small-endian (PC ou DEC). Pour le format Tivoli, le champ -bo (byte order définit le type de plateforme et deux possibilités existent en pratique : Big endian SUN ABCD Small endian DEC DCBA Existe aussi l extension rvb correspond à des images couleurs 8 bits : chaque pixel est représenté par un triplet d unsigned char. Notons qu il est aussi possible d associer à un fichier.ima (unsigned char) un fichier d extension.3lt donnant la LUT (look up table), ce qui permet ainsi d archiverdans un minimum de place des donnéesen fausses couleurs (ou du moins limitées à 256 couleurs). Cette possibilité est très utile sous Scilab si l on veut l utiliser dans sa configuration d origine sans charger les outils spécifiques aux images. 2.2 Images complexes xima permet de manipuler les images complexes, chaque pixel étant, au final, décrit par une partie réelle et une partie imaginaire. 2.2.1 Images complexes : Formats naturels Le format le plus intuitif est de décrire un pixel par un doublet, une partie réelle et une partie imaginaire, au format balayage video (de même qu une image couleur est décrite par 3 octets). Ces valeurs sont signées. type xima Tivoli Matlab fread Scilab Python extension -type -type -bo type machine mget unpack cmplx 8.cxb C8 int8 c b cmplx 16.cxs CS16 SUN int16 b sb >h.cxs CS16 DEC int16 l sl <h cmplx 32.cxf CFLOAT SUN float b fb >f.cxf CFLOAT DEC float l fl <f cmplx 64.cxd CDOUBLE SUN float64 b db >d.cxd CDOUBLE DEC float64 l dl <d 2.3 Images complexes : Autres formats type xima Tivoli Matlab fread Scilab Python extension -type -type -bo type machine mget unpack cmplx 8.cxbtivo CS8TIVO int8 c b cmplx 16.cxstivo CS16TIVO SUN int16 b sb >h cmplx 16.CXSTIVO CS16TIVO DEC int16 l sl <h cmplx 32.cxftivo C32TIVO SUN float b fb >f cmplx 32.CXFTIVO C32TIVO DEC float l fl <f cmplx 8.cxb C8ADTS uint8 uc B cmplx 16.cxsadts C16ADTS SUN uint16 b usb >H cmplx 16.CXSADTS C16ADTS DEC uint16 l usl <H cmplx 32.cxfadts C32ADTS SUN float b fb >f cmplx 32.CXFADTS C32ADTS DEC float l fl <f 2
Dans le premier cas, deux plans sont fournis par image : le premier correspond à la partie réelle, le second à la partie imaginaire. Dans le second cas, deux plans sont fournis par image : le premier correspond à l amplitude et le second à la phase (entre 0 et 255 en 8 bits, entre 0 et 65535 pour les 16 bits). Cette liste ne couvre pas touts les cas puisque : Certaines images radar Terrasar-X sont en demi-float : parties réelles et parties imaginaires sont codées sous cette forme et n occupent que 2 octets (même dimensions qu un fichier.cxs). Sandia propose des images radar (données complexes, extension.gff)), chaque pixel étant décrit par deux valeurs cpnsécutives, la première étant l ampitude et la seconde la phase. Dans les deux cas, xima reconnait le format et en permet l archivage dans un format plus traditionnel. 3 Mise en œuvre Nous proposons ici des procédures permettant de lire une image et d en placer les valeurs dans un tableau de float 2. De plus, un outil graphique élémentaire (car n utilisant aucune boîte à outil image ) est proposé (sauf en C). Les noms de ces procédure/méthodes sont volontairement identiques selon les plateformes : imz2mat pour le lecteur/chargeur. Cette procédure renvoie un tableau de float. visusar pour le visualiseur. Si la matrice a des valeurs complexes, l amplitude sera affichée. visusar possède quelques spécificités qui seront abordées au paragraphe 4. Les images disponibles sont : une image 8 bits, lena.ima une image 16 bits, erslely.imw (donc big endian) une image complexe, lorgeval.cxs (donc big endian) une donnée complexe multitemporelle (deux canaux) : tsarang.ima (donc big endian). Le.dim de cette image est expliqué au paragraphe 5. 3.1 Matlab Il faut au préalable récupérer les deux procédures imz2mat.m et visusar.m. Le répertoire de ces deux fichiers doit appartenir au PATH de Matlab. La validation de ces procédures a été effectuée sous Matlab 2012. L exemple élémentaire testtiilab.m est aussi fourni. 3.1.1 Matlab : Image monoplan/monocanal A = imz2mat( lena.ima ); Si l on souhaite récupérer les dimensions de l image, on peut écrire [A, ncol, nlig, ncanal] = imz2mat( lena.ima ); L image étant mono-plan, on a ncanal = 1. La matrice A est alors à 2 dimensions. Notons que scilab gère les nombres complexes : la matrice A est alors réelle ou complexe selon la nature initiale de l image. 3.1.2 Matlab : Image Multiplan/Multicanal La matrice A retour de l appel de la procédure imz2mat a alors 3 dimensions. L appel à visusar.m doit spécifier une matrice à deux dimensions (il faut choisir le canal). Dans cet exemple, on cherche à visualiser le canal 2 : [A, ncol, nlig, ncanal] = imz2mat( tsarang.ima ); visusar(a(:,:,2)); Attention aux indices : Matlab commence à 1. 2. Il n y a plus de problème de dimension d images en 2015 sur les machines 64 bits courantes. 3
3.2 Scilab Il faut au préalable récupérer le fichier tiilab.sci qui contient les procédures imz2mat et visusar. La validation de ces procédures a été effectuée sous Scilab 5.5.2 (Linux) et 5.5.3 (Linux et Windows). L exemple élémentaire testtiilab.sce est aussi fourni. 3.2.1 Scilab : Image monoplan/monocanal exec("tiilab.sci"); A = imz2mat( lena.ima ); Si l on souhaite récupérer les dimensions de l image, on peut écrire [A, ncol, nlig, ncanal] = imz2mat( lena.ima ); L image étant mono-plan, on a ncanal = 1. La matrice A est alors à 2 dimensions. Notons que matlab gère les nombres complexes : la matrice A est alors réelle ou complexe selon la nature initiale de l image. 3.2.2 Scilab : Image Multiplan/Multicanal La matrice A retour de l appel de la procédure imz2mat a alors 3 dimensions. L appel à visusar doit spécifier une matrice à deux dimensions (il faut choisir le canal). Dans cet exemple, on cherche à visualiser le canal 2 : exec("tiilab.sci"); [A, ncol, nlig, ncanal] = imz2mat( tsarang.ima ); visusar(a(:,:,2)); Attention aux indices : Scilab commence à 1. 3.3 Python Il faut placer dans le répertoire adequat le fichier tiilab.py qui incorpore les modules imz2mat et visusar. Ce code a été testé sous : Python 2.6.6 et 2.7.3, environnement Spyder 2 (Linux et Windows) Python 3.5, environnement Pyzo L exemple élémentaire testtiilab.py est aussi fourni. 3.3.1 Python : Image monoplan/monocanal import tiilab img=tiilab.imz2mat("lena.ima"); tiilab.visusar(img[0]) 3.3.2 Python : Image Multiplan/Multicanal La matrice img[0], qui est une des variables retournées en retour de l appel de la méthode imz2mat, est alors un tableau à 3 dimensions. L appel à visusar doit spécifier une matrice à deux dimensions (il faut choisir le canal). Dans cet exemple, on cherche à visualiser le canal 2 : import tiilab img = tiilab.imz2mat("tsarang.ima"); tiilab.visusar(img[0][:,:,1]) Attention aux indices : Python commence à 0. 4
3.4 Code C Il faut récupérer la procédure tiilab.c (construit à partir de briques xima) et utiliser la routine tiilab imz2mat. Attention : le nombre de paramètres de cette procédure est variable : il faut donc achever la liste par NULL. Il n y a pas de visualisation proposée dans TIILAB, mais le programme test tiilab.c propose un archivage des données au format Tivoli/Xima. 3.4.1 Code C : Image monoplan/monocanal float *tabima; int ncol, nlig; tabima = tiilab_imz2mat( "lena.ima", &ncol, &nlig, &nkanal, &ntemps, NULL); 3.4.2 Code C : Image Multiplan/Multicanal Voici un exemple élémentaire utilisant l image tsarang.ima. float *tabima; int ncol, nlig, nkanal, ntemps; tabima = tiilab_imz2mat( "tsarang.ima", &ncol, &nlig, &nkanal, &ntemps, NULL); En retour, le tableau a ncol nlig nkanal pixels : le programmeuraura donc à gérerlui même les décalages pour le choix du canal (avec un fseek par exemple). Attention aux indices : C commence à 0. Attention : le langage C ne gère pas les complexes. Dans le cas de pixels complexes, le tableau retourné a 2 ncol nlig nkanal valeurs et c est au programmeur à gérer le problème. 3.5 Code Java Le fichier ExempleTiilab.java propose un exemple de lecture de fichiers Tivoli/Xima par Java (méthode imz2mat sur un objet de classe FichierXima) ainsi qu une visualisation de l image (méthode visusar sur un objet de classe visutii). La gestion des endian étant une tâche assez complexe en Java (qui fonctionne de base en big endian), cet exemple se cantonne aux données sur 8 bits et 16 bits (c est à dire les format.ima,.imw/.imw et.cxs/.cxs). Il peut quand même servir d initiateur à des codes plus complexes et complets. 4 Au sujet de visusar Dans les exemples précédents, le seul argument à passer à visusar est le tableau image. Dans le cas, visusar calcule une image en 256 niveaux de gris, le noir correspondant au min du tableau, et le blanc à une valeur très appréciée en imagerie radar : valeur moyenne + 3 sigma. Cette valeur de 3 est très empirique : on peut la modifier (valeurs positives quelconque) ou même inhiber ce seuil en choissisant la valeur 0 (le noir correspondant au min du tableau, et le blanc au max du tableau). Dans ce cas, il suffit de rajouter cette valeur dans visusar en matlab : visusar(a,2.5) en scilab : visusar(a,2.5) en python : tiilab.visusar(img[0],2.5) 5 Au sujet du.dim C est un fichier ASCII qui, à l origine, ne contenait que le nombre de lignes et le nombre de colonnes. L extension Tivoli a ajouté un certain nombre de paramètres indispensables à la lecture d une image qui sont : la modification de la première ligne qui inclut en sus du nombre de lignes et du nombre de colonnes le nombre de plans et le nombre de coupes. l ajout de données caractérisées par une clé et une valeur (une donnée par ligne ASCII) : la clé -type : le type de données (voir le paragraphe 2) la clé -bo (byte order) : pour prendre en compte l endian (voir le paragraphe 2) 5
la clé -offset : poru prendr e en compte le décalage des données image par rapport au début du fichier image (cela peut permettre de traiter des fichiers.tif par un simple.dim puisqu en général les données d un fichier.tif sont positionnées à 8 octets après l origine du fichier) Ceci permet d expliquer le.dim de l image tsarang : 512 512 2 1 -type CS16 La donnée radar a été acquise sur 2 dates. C est un signed short complexe. 6 Perspectives Ce document et les codes proposés sont en version β : des évolutions sont à prévoir, ainsi que des étapes de déverminages... 6