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:
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.
DICOM définit la représentation XML comme suit:
L'élément racine d'un objet DICOM XML est représenté par une balise NativeDicomModel.
Exemple:
Cet élément racine peut contenir des balises DicomAttribute ou chacune d'elle représente un Data Element.
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.
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".
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"
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"
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"
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 :
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:
Cette balise permet de représenter la valeur d'une VR de type PN. Elle est composée de 3 éléments fils optionnels:
Exemple:
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:
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:
Exemple 2:
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:
Un exemple de fichier DICOM au format XML est disponible ici.
- 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 + '>'.
2. Encodage DICOM
DICOM définit la représentation XML comme suit:
Native DICOM Model |
Exemple:
<?xml version="1.0" encoding="UTF-8"?>
<NativeDicomModel>
...
</NativeDicomModel>
<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>
<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>
<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.
- 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>
<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>
<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>
<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>
<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>
<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.