lundi 27 août 2018

L'encodage d'objet DICOM - Format XML

La partie PS3.19 (section 10 et Annexe A) du standard DICOM définit un encodage des objets DICOM au format XML. Cette représentation est appelée « Native DICOM Model ». Contrairement à l'encodage classique qui est binaire (non interprétable sous forme de texte), cet encodage est 100% textuel. En définissant un tel système d'encodage, DICOM permet:
  • d'utiliser les (nombreux) outils XML plutôt que de se reposer sur des outils spécifiques DICOM. Il est ainsi plus simple de valider ou d'effectuer des traitements en XML qu'en DICOM ;
  • d'améliorer la lisibilité d'un objet DICOM. Il est en effet plus facile pour un humain de lire et modifier un objet texte plutôt qu'un objet binaire.
Remarque: Ce système d'encodage n'est pas fait pour se substituer à l'encodage classique qui reste le plus économe en taille pour représenter un objet DICOM. Il permet réellement de faciliter les traitements via l'utilisation d'outils XML.

1. Présentation de XML


XML est un langage textuel qui s'écrit à l'aide d'éléments balisés. Chaque élément XML commence par une balise ouvrante et se termine par une balise fermante de même nom.
  • Une balise ouvrante s'écrit : '<' + nom_balise + '>' ;
  • Une balise fermante s'écrit : '</' + nom_balise + '>'.
Un élément XML peut avoir des propriétés, sous la forme d'attributs XML, situées dans la balise ouvrante. Un attribut XML s'écrit sous la forme nom="valeur". Le nom ne peut pas avoir de caractère espace et la valeur est toujours entre guillemets. Chaque élément XML peut contenir une valeur textuelle ou des éléments XML.

2. Encodage DICOM


DICOM définit la représentation XML comme suit:
Native DICOM Model
L'élément racine d'un objet DICOM XML est représenté par une balise NativeDicomModel.

Exemple:
<?xml version="1.0" encoding="UTF-8"?>
<NativeDicomModel>
 ...
</NativeDicomModel>


2.1 La Balise DicomAttribute


Cet élément racine peut contenir des balises DicomAttribute ou chacune d'elle représente un Data Element.

2.1.1. Les attributs de DicomAttribute


Dans l'article « Les données en DICOM », il a été vu qu'un Data Element contient un certain nombre de caractéristiques comme son identifiant (le tag), son type (la VR) ou encore le Keyword qui est un alternatif au tag. Dans l'encodage XML, ces caractéristiques sont représentées par des attributs XML. Les attributs « tag », « vr » et « keyword » sont obligatoires alors que l'attribut « privateCreator » est, quant à lui, optionnel.

2.1.1.1. L'attribut tag


La valeur de cet attribut XML est formée des 8 caractères en capital de l'identifiant hexadécimal du tag DICOM (ggggeeee, ou gggg est le groupe et eeee l'élément dans le groupe).

Exemple: le Data Element (7fe0, 0010) aurait la valeur suivante : tag="7FE00010".

2.1.1.2. L'attribut vr


La valeur de cet attribut XML permet de spécifier le type de l'attribut DICOM. Il est formée des 2 caractères en capital de la VR tel que défini dans le tableau PS3.5 - Table 6.2-1.
Les valeurs autorisées sont : "AE", "AS", "AT", "CS", "DA", "DS", "DT", "FL", "FD", "IS", "LO", "LT", "OB", "OD", "OF", "OL", "OW", "PN", "SH", "SL", "SQ", "SS", "ST", "TM", "UC", "UI", "UL", "UN", "UR", "US", "UT".

Exemple: vr="US"

Remarque: Il existe une petite incohérence dans le standard (version 2018) sur l'optionalité de cet attribut. En effet, la figure A.1.4-1 Native DICOM Model ainsi que le Schéma XML décrit dans la section A.1.6 indiquent que l'attribut « vr » est obligatoire. En revanche le tableau A.1.5-2 indique que l'attribut est optionnel. Puisque 2 sources sur 3 indiquent qu'il est obligatoire, nous admettons que cet attribut est requis.

2.1.1.3. L'attribut keyword


La valeur de cet attribut est formée d'une chaîne de caractères dont le contenu est indiqué dans la colonne Keyword de la partie PS3.6 - section 6 - Tableau 6.1 du standard. Il permet de reconnaître plus facilement un Data Element en lui attribuant un nom unique.

exemple: keyword="SOPClassUID"

2.1.1.4. L'attribut privateCreator


La valeur de cet attribut XML indique le nom ou l'identifiant du créateur du DICOM Element privé. On peut trouver un nom de compagnie ou encore un nom de logiciel. Il est possible de mettre ce que l'on veut comme chaîne de caractères pour indiquer ce qu'est cet élément.

exemple: privateCreator="SIEMENS"

2.1.1.5. Exemple de DicomAttribute


<?xml version="1.0" encoding="UTF-8"?>
<NativeDicomModel>
 <DicomAttribute tag="00080020" vr="DT" keyword="StudyDate">
  ...
 </DicomAttribute>
 <DicomAttribute tag="00190090" vr="DS" keyword="MyPrivateElement" privateCreator="MyCompagny">
  ...
 </DicomAttribute>
  ...
 <DicomAttribute tag="7FE00010" vr="OB" keyword="PixelData">
  ...
 </DicomAttribute>
</NativeDicomModel>

2.1.2 La valeur de DicomAttribute


Chaque balise DicomAttribute représente un Data Element dont la valeur est représentée en XML par une ou plusieurs balises filles qui, en fonction de la VR, peuvent être :
  • des balises Value ;
  • une balise BulkData ou InlineBinary ;
  • une balise PersonName ;
  • des balises Item.

2.1.1 La Balise « Value »


Elle permet de stocker la valeur d'un Data Element pour les VR autres que SQ, PN, OB, OD, OF, OW et UN. La balise « Value » contient un attribut « number » qui spécifie le nombre de valeurs dans le Data Element ainsi que l'ordre des valeurs (ordre d'interprétation) dans la balise DicomAttribute.

Exemple:
<DicomAttribute tag="00080020" vr="DA" keyword="StudyDate">
 <Value number="1">20180609</Value>
</DicomAttribute>
<DicomAttribute tag="00080061" vr="CS" keyword="ModalitiesInStudy">
 <Value number="1">CT</Value>
 <Value number="2">PET</Value>
</DicomAttribute>

2.1.2. La Balise « PersonName »


Cette balise permet de représenter la valeur d'une VR de type PN. Elle est composée de 3 éléments fils optionnels:
  • Alphabetic: pour la représentation des systèmes d'écriture alphabétique;
  • Ideographic: pour la représentation des systèmes d'écriture idéographique; 
  • Phonetic: pour la représentation des systèmes d'écriture phonétique.
Chacun des éléments représentant un système d'écriture est composé de 5 éléments fils optionnels qui, dans le cadre français, ont la signification suivante :
  • FamilyName : Contient le nom d'usage de la personne ;
  • GivenName : Contient le premier prénom ;
  • MiddleName : Contient les prénoms autres que le premier prénom, séparés par un caractère espace ;
  • NamePrefix : Contient la civilité (« M. » ou « Mme ») ;
  • NameSuffix : Non utilisé dans le cadre français.
Remarque: En France, la réponse ministérielle (n°5128 du 3 mars 1983) précise que la civilité Mademoiselle (Mlle) ne devrait pas être utilisée.

Exemple:
<DicomAttribute tag="00100010" vr="PN" keyword="PatientName">
 <PersonName number="1">
  <Alphabetic>
   <FamilyName>Dupond</FamilyName>
   <GivenName>Jean</GivenName>
   <NamePrefix>M.</GivenName>
  </Alphabetic>
 </PersonName>
</DicomAttribute>

2.1.3. La Balise « InlineBinary »


Elle permet d'encoder en base64 la valeur des Data Element dont la VR est OB, OD, OF, OW, ou UN. En effet, ces VR contiennent des données binaires. Or XML étant un langage textuel, il est nécessaire de convertir les données binaires au format texte. DICOM a choisi d'utiliser l'encodage base64 pour effectuer cette transformation.

Exemple:
<DicomAttribute tag="7FE00010" vr="OW" keyword="PixelData">
 <InlineBinary>Qm9uam91ciDDoCB0b2k=</InlineBinary>
</DicomAttribute>

Remarque: L'encodage en base64 présente le gros inconvénient d'augmenter d'au moins 1/3 la taille des données converties. Il est donc préférable, dans la mesure du possible, d'utiliser la balise BulkData qui permet de faire une référence sur les données binaires plutôt que de les inclure.

2.1.4. La Balise « BulkData »


Elle permet d'encoder une référence à un blob (Binary Large OBject) de données. Le but étant d'éviter de stocker de larges données DICOM dans une structure XML. Ce blob est référencé via une URI grâce à un attribut XML « uri ». Ce blob peut être situé localement sur un système de fichier ou encore sur un réseau.

Exemple 1:
<DicomAttribute tag="7FE00010" vr="OW" keyword="PixelData">
 <BulkData uri="file:/C:/monRep/file.dcm?offset=16&length=524"/>
</DicomAttribute>

Exemple 2:
<DicomAttribute tag="7FE00010" vr="OW" keyword="PixelData">
 <BulkData uri="http://server/rs/studies/1.2.3/series/5.6.7/instances/9.8.6"/>
</DicomAttribute>

2.1.5. La Balise « Item »


Elle permet de stocker des éléments XML de type DICOMAttribute. Cela revient à encoder des séquences DICOM. Si une séquence contient plusieurs Item, chacun d'autres eux sera encodé en XML via une balise « Item ».

Exemple:
<DicomAttribute tag="7FE00010" vr="SQ" keyword="ContentSequence">
 <Item number="1">
  <DicomAttribute tag="00080020" vr="DA" keyword="StudyDate">
   ...
  </DicomAttribute>
  <DicomAttribute tag="00080060" vr="CS" keyword="Modality">
   ...
  </DicomAttribute>
 </Item>
 <Item number="2">
  ...
 </Item>
</DicomAttribute>

3. Exemple complet d'un encodage XML


Un exemple de fichier DICOM au format XML est disponible ici.

Aucun commentaire:

Enregistrer un commentaire