mercredi 24 octobre 2018

Les images en DICOM - Partie 3

Cet article constitue la seconde sous-partie sur les images compressées.
Il traite des syntaxes de transfert et des différents schémas de compression adoptés par DICOM.
Une partie des descriptions des différents schémas de compression est inspirée de l'article « Place des standards dans le contexte de la compression des données médicales » de Bernard Gibaud et Joël Chabriais (voir les références en bas de la page).

En informatique, lorsque l'on désire échanger un objet avec d'autres applications, on utilise un mécanisme de sérialisation. Ce dernier permet de mettre un objet sous une forme (textuelle ou binaire) depuis laquelle il pourra être reconstitué à l'identique. Ainsi il pourra être stocké sur un disque dur ou transmis au travers d'un réseau.

En DICOM, la sérialisation d'un objet (en DICOM classique, XML et JSON) est guidée par la syntaxe de transfert. Cette dernière représente un ensemble de règles qui s'articule autour de deux notions:
  • la VR : implicit ou Explicit ;
  • La compression des pixels d'une image.
Remarque: Avant 2016, une troisième notion entrait en jeu : l'Endianisme.
L'encodage en Big Endian ayant été retiré du standard en 2016, seul l'encodage Little Endian peut maintenant être utilisé. En théorie, depuis 2016, il ne faut donc plus sérialiser d'objet en Big Endian mais uniquement en Little Endian.

1. La sérialisation de la VR (Implicit/Explixit)


Pour une sérialisation au format XML ou JSON, la VR est toujours Explicit car encodée directement dans la représentation XML et JSON d'un Data Element.
Pour l'encodage au format DICOM Classique, la syntaxe de transfert indique si l'encodage de la VR doit se faire implicitement ou explicitement.

Remarque : Les notions Implicit et Explicit ont été vues dans les articles « L'encodage d'objet DICOM - partie 1 » et « L'encodage d'objet DICOM - partie 2 ».

2. La compression des pixels d'une image


Il a été vu dans les articles « Les images en DICOM - Partie 1 » et « Les images en DICOM - Partie 2 » qu'une image peut être compressée ou pas.

Mais comment savoir si une image est compressée ou non?

Une solution consisterait à analyser le tag (7FE0, 0010) Pixel Data. Si une séquence apparaît alors les pixels sont compressés, sinon les pixels ne le sont pas.
Il n'est néanmoins pas possible d'aller plus loin dans l'analyse et de savoir si les pixels sont encapsulés en « JPEG Baseline » par exemple ou en « JPEG2000 Lossless ».
Par conséquent, impossible pour un logiciel de savoir quel Codec utiliser pour décompresser l'image.

La syntaxe de transfert permet de résoudre ce problème en indiquant comment les pixels sont encodés (Natif ou Encapsulé) et quel type de compression a été utilisé.

Remarque: La syntaxe de transfert s'applique pour les images fixes et animées (les films) - cf. PS3.6 - Table A.1.

3. Mais comment ça marche une syntaxe de transfert ?


Une syntaxe de transfert est représentée par un nom et un identifiant unique. Cet identifiant est sous la forme d'un UID (un enchaînement de chiffres et de points - voir PS 3.5 section 9 pour plus de détails).

Exemple : 1.2.840.10008.1.2

Ainsi, en lisant cet identifiant, il est possible de savoir comment les pixels sont encodés et donc de savoir quel Codec utiliser pour décompresser une image.

Remarque et spoiler : Pour les fichiers DICOM, la syntaxe de transfert est stockée dans le « File Meta Header » d'un fichier DICOM. En lisant cet en-tête en premier lieu, on détermine s'il faut utiliser un dictionnaire de données ou non pour interpréter les éléments (Implicit ou Explicit) et quel codec il faut utiliser si besoin. Pour un échange via un réseau, la syntaxe de transfert est négociée entre l'émetteur et le récepteur en début de connexion via une procédure de handshake appelée « Association DICOM » (à l'exclusion des échanges DICOMweb).

4. Les principaux types de compressions pour les images


4.1. Les types Natifs (Non Compressés)


Avec ces types d'encodages, il n'est pas nécessaire de disposer de codec pour lire ou écrire des images dans un objet DICOM.

Nom Syntaxe de transfert Description
Implicit VR Little Endian 1.2.840.10008.1.2 Lorsque cette syntaxe de transfert est utilisée, tous les Data Element doivent être encodés en Little Endian sans inclure la VR (Implicit). Puisque la VR est implicite, il est nécessaire de disposer d'un dictionnaire de données pour apporter un sens aux données. Cette syntaxe de transfert est la seule obligatoire par le standard; c'est-à-dire qu'elle doit être supportée par tous les constructeurs et éditeurs d'applicatifs DICOM. Aucune autre syntaxe de transfert dans le standard n'utilise de VR implicite. En utilisant cette syntaxe de transfert, le tag (7FE0,0010) Pixel Data doit utiliser une Value Representation de type OW (cf. PS3.5 Annexe A.1).
Explicit VR Little Endian 1.2.840.10008.1.2.1 Avec cette syntaxe de transfert, tous les tags doivent être encodés en Little Endian en incluant la VR (Explicit). Cette syntaxe de transfert est plus régulièrement utilisée, car chaque type de données DICOM est spécifié. En utilisant cette syntaxe de transfert, il n'est plus nécessaire de disposer d'un dictionnaire de données pour interpréter la valeur d'un tag DICOM (cf. PS3.5 Annexe A.2).
Explicit VR Big Endian 1.2.840.10008.1.2.2 Similaire à la syntaxe de transfert Explicit VR Little Endian à l'exception de l'ordre de stockage des octets. Cette syntaxe de transfert ne fait plus partie du standard depuis 2016 (cf. PS3.5 Annexe A.3).

4.2. Les types de compressions JPEG


L'International Standards Organisation ISO/IEC JTC1 a développé deux standards internationaux nommés ISO/IS-10918-1 (JPEG Part 1) et ISO/IS-10918-2 (JPEG Part 2), et connus comme le standard JPEG.
Ce standard définit des méthodes de compressions avec perte (lossy) et sans perte (lossless). Parmi les 29 procédés de codage (process en anglais) disponibles dans le standard JPEG, DICOM en a retenu 4 (cf. PS3.5 - Tableau A.4-3): les procédés 1, 2, 4 et 14.

Nom Syntaxe de transfert Description(1), (2), (3)
JPEG Baseline (Process 1) 1.2.840.10008.1.2.​4.​50 C'est le procédé de base de JPEG (tout décodeur JPEG doit au moins gérer ce mode). Il est basé sur une transformée en cosinus discrète1 (DCT) de base (baseline), et exploite le codage de Huffman.
La DCT permet d'éliminer des données non pertinentes pour l’œil humain (destruction de données) avec un ratio ajustable Ce format est toujours destructeur (avec perte) indépendamment du ratio de compression choisi (une image compressée avec une qualité de 100% ne sera pas identique à l'originale).
Ce procédé ne fonctionne que pour des images de 8 bits de profondeur (SamplePerPixel = 8). (cf. PS3.5 - Annexe F.1, PS3.5 - Annexe A.4.1, PS3.5 - section 10.3)
JPEG Extended (Process 2 & 4) 1.2.840.10008.1.2.​4.​51 Ce procédé ajoute des extensions au mode JPEG Baseline (Process 1). Il peut par exemple, gérer des images ayant 12 bits de profondeur. Ce format est toujours destructeur (avec perte).
 - « Process 2 » indique un codage de type DCT séquentiel étendu avec un codage d'Huffman. Chaque échantillon est codé sur 8 bits (SamplePerPixel = 8).
 - « Process 4 » indique un codage de type DCT séquentiel étendu avec un codage d'Huffman. Chaque échantillon est codé sur 12 bits (SamplePerPixel = 12).
JPEG Lossless, Non-Hierarchical (Process 14) 1.2.840.10008.1.2.​4.​57 Ce système de codage correspond au procédé 14 décrit par le standard JPEG, qui indique un codage de type DPCM avec un codage d'Huffman. Chaque échantillon est codé sur 2 à 16 bits. L'idée générale de la méthode DPCM est de prédire la valeur de chaque pixel en fonction de la valeur des pixels précédents. Ce mode de compression est sans perte.
JPEG Lossless, Non-Hierarchical, First-Order Prediction (Process 14 [Selection Value 1]) 1.2.840.10008.1.2.​4.​70 Ce mode de codage reprend le précédent en ajoutant une contrainte sur la prédiction (il fait intervenir une prédiction d'ordre 1 - horizontale).
Il est également sans perte.

Remarque: Une image de 8 bits de profondeur peut être encodée via le procédé (process) 1 ou 2. Le standard DICOM recommande d'utiliser le procédé 1 (JPEG Baseline) pour encoder une image de 8 bits de profondeur, à moins que des spécificités liées aux extensions proposées par JPEG Extended ne soient requises (cf. PS3.5 - Annexe A.4.1 - Note 3).

Remarque: Afin de faciliter l'interopérabilité des applications faisant appel aux syntaxes de transfert JPEG, le standard mentionne explicitement:
  • que les applications implémentant JPEG « lossless » doivent supporter JPEG Lossless, Non-Hierarchical (Process 14) (cf. PS3.5 - Section 10.2) ;
  • que les applications implémentant JPEG « lossy » pour des images sur 8 bits doivent supporter JPEG Baseline (Process 1) (cf. PS3.5 - Section 10.3) ;
  • que les applications implémentant JPEG « lossy » pour des images sur 12 bits doivent supporter JPEG Extended (Process 4) (cf. PS3.5 - Section 10.3).

4.3. Le type de compression RLE


La méthode de compression RLE (Run Length Encoding) est utilisée par de nombreux formats d'images tels que BMP, PCX et TIFF. Elle est basée sur la répétition d'éléments consécutifs.

Nom Syntaxe de transfert Description(2), (3)
RLE Lossless 1.2.840.10008.1.2.5 Cette méthode de compression sans perte compresse les données en y recherchant des successions d'octets identiques. L'efficacité de cet algorithme dépend grandement du contenu et de la qualité de l'image. Si les répétitions d'éléments consécutifs ne sont pas nombreuses, l'algorithme n'est pas performant, voir contre-productif (la version compressée est plus volumineuse que la version originale). En réalité, RLE ne compresse que lorsque cela est nécessaire (il laisse la chaîne telle quelle lorsque la compression est contre-productive). Cette méthode fonctionne donc bien sur les images possédant de larges parties uniformes.

4.4. Le type de compression JPEG-LS


JPEG-LS, à savoir ISO/IS-14495-1 (JPEG-LS Part 1) désigne un autre standard proposé par l'International Standards Organisation ISO/IEC JTC1 pour représenter les images compressées, avec ou sans perte de données. Il spécifie un mode de compression unique, fondé sur une méthode prédictive utilisant un modèle statistique, modélisant les différences entre les pixels et leur voisinage. Cette méthode est réputée plus efficace que celle spécifiée dans JPEG. JPEG-LS peut traiter des images jusqu'à une profondeur de 16 bits (cf. PS3.5 Annexe F.2).

Nom Syntaxe de transfert Description(2), (3)
JPEG-LS Lossless 1.2.840.10008.1.2.​4.​80 Ce codage utilise JPEG-LS en mode sans perte. Nativement, le standard JPEG-LS spécifie un mode avec perte (near-lossless), mais une compression sans perte peut être atteinte en contraignant la valeur d'erreur à 0 (cf. PS3.5 Annexe F.2).
JPEG-LS Lossy (Near-Lossless) 1.2.840.10008.1.2.​4.​81 Similaire à JPEG-LS Lossless mais avec une erreur bornée à une valeur précise. (cf. PS3.5 Annexe F.2). Ce format est avec perte.

4.5. Le type de compression JPEG-2000


JPEG-2000 est le nom usuel du standard ISO/IEC 15444 (JPEG 2000), toujours dédié à la représentation des images compressées. JPEG 2000 introduit de nouveaux schémas de compression par ondelettes et sur des transformations multi-composantes, applicables notamment aux images en couleur.
La partie 2 du standard (ISO/IEC 15444-2) complète la partie 1 (ISO/IEC 15444-1) avec des extensions des transformations multi-composantes ICT (Irreversible Colour Transform) et RCT (Reversible Colour Transform).
Ces extensions sont d'une part des schémas de prédiction de type DPCM, et d’autre part des transformations plus complexes comme la Transformée de Karhunen-Loeve2. La compression par ondelettes est particulièrement appropriée pour les images.

Nom Syntaxe de transfert Description(2), (3)
JPEG 2000 (Lossless Only) 1.2.840.10008.1.2.​4.​90 Ce codage utilise JPEG-2000 Partie 1 en mode sans perte. Il fait appel à un schéma de compression par ondelettes, ou à une transformée multi-composantes en mode réversible, sans quantification.
JPEG 2000 1.2.840.10008.1.2.​4.​91 Ce codage utilise JPEG-2000 Partie 1 en mode avec perte de données. Ce mode peut s'appuyer sur des transformées réversibles ou non réversibles, avec ou sans quantification.
JPEG 2000 Part 2 Multi-component (Lossless Only) 1.2.840.10008.1.2.​4.​92 Ces deux modes étendent les possibilités des deux précédentes syntaxes de transfert en exploitant les possibilités offertes par JPEG-2000 Partie 2. Il s'agit d'une généralisation du codage multi-composantes (qui est appliqué dans la partie 1 de JPEG-2000), en considérant que toute séquence d'images peut être vue comme une image multi-composantes.
Un mécanisme souple permet en outre d'ordonner et de rassembler les composantes en groupes de composantes, pour une efficacité optimale. Appliquées à des images DICOM multi-frames, ces codages permettent une élimination des redondances inter-images. Ceux-ci devraient donc être de plus en plus utilisés, avec la diffusion des nouveaux IOD Enhanced CT et Enhanced MR, qui utilisent largement les images multi-frames.
JPEG 2000 Part 2 Multi-component 1.2.840.10008.1.2.​4.​93

5. Les formats spéciaux


Voici une section bonus permettant de présenter des syntaxes de transferts un peu spéciales. Le but est de savoir qu'elles existent.

Nom Syntaxe de transfert Description(2), (3)
Deflated Explicit VR Little Endian 1.2.840.10008.1.2.​1.​99 Contrairement aux autres modes de compression du standard, celui-ci ne compresse pas seulement les pixels d'une image, mais encode l'objet DICOM en entier. Pour faire cela, l'algorithme Deflate définit par la RFC 1951 est utilisé. Cela revient à zipper tout l'objet DICOM. Ce format de compression est particulièrement bien adapté pour des objets DICOM sans image (par exemple des objets DICOM SR). Il peut néanmoins être utilisé par la compression d'un objet contenant des images mais des algorithmes comme JPEG-2000 sont mieux adaptés. Ce format de compression est sans perte. Pour plus de détails, voir PS3.5 - Annexe A.5.
JPIP Referenced 1.2.840.10008.1.2.​4.​94 Ce système de compression permet de transférer des images de manière progressive, c'est-à-dire en permettant l'affichage des données, avec une précision croissante au fur et à mesure de la transmission. L'utilisateur peut donc voir l'image avant que le transfert ne soit terminé, et l'interrompre si celui-ci n'est plus nécessaire. L'implémentation de ce mécanisme s'appuie sur le Protocole Interactif proposé dans le cadre de JPEG 2000 (JPEG 2000 Interactive Protocol ou JPIP). Son utilisation dans DICOM consiste à ne plus utiliser le tag (7FE0, 0010) Pixel Data mais à utiliser le tag (0028, 7FE0) Pixel Data Provider URL à la place. Ce dernier contient l'URL du site duquel on peut récupérer les images via le protocole JPIP. L'objet DICOM est donc très allégé (car il ne contient plus les pixels de l'image) mais une connexion réseau est nécessaire pour obtenir l'image. Pour plus de détails, voir PS3.5 - Annexe A.6.
JPIP Referenced Deflate 1.2.840.10008.1.2.​4.​95 Ce système combine le système JPIP Referenced et Deflated Explicit VR Little Endian. Les pixels sont retirés de l'objet DICOM et mis à disposition sur un serveur via une URL. Le résultat est ensuite compressé en utilisant l'algorithme Deflate. Pour plus de détails, voir PS3.5 - Annexe A.7.

Ressources :
(1) La transformée en cosinus discrète : http://www.ulb.ac.be/cours/acohen/travaux_2006_infodoc/CompressionNumerique/AvecPertesTDC.htm
(2) Place des standards dans le contexte de la compression des données médicales https://www.researchgate.net/publication/44813913_Place_des_standards_dans_le_contexte_de_la_compression_des_donnees_medicales.
(3) MedicalConnections - Transfer Syntax : https://www.medicalconnections.co.uk/kb/Transfer-Syntax/

lundi 8 octobre 2018

Les images en DICOM - Partie 2

Cet article constitue la seconde partie consacrée aux images dans DICOM.
Dans la première partie, nous avons parlé des images dites « natives », c'est-à-dire qui n'utilisent pas de technique de compression.
Ce billet est consacré aux images dites « encapsulées », c'est-à-dire qu'elles utilisent des techniques de compression pour encoder les pixels des images.
Le but des techniques de compression est d'économiser de l'espace si l'objet DICOM est stocké sur un support physique, ou de gagner du temps lors du transfert d'un objet DICOM via un réseau.

Le thème des techniques de compression dans DICOM est assez vaste. C'est pourquoi ce sujet est décomposé en deux sous-parties :
  • La compression et l'encodage en DICOM ;
  • Les syntaxes de transfert & les différents schémas de compression adoptés par DICOM.
Ce billet parle de la première sous-partie.

1. La Compression


Compresser une image, ou de manière plus générale des données, consiste à appliquer une transformation sur ces données pour en réduire la taille. Une fois cette opération effectuée, il n'est alors en général plus possible de les lire (un peu comme si elles étaient cryptées, sauf qu'ici, le but premier n'est pas de rendre illisible les données, mais d'en réduire la taille). Pour pouvoir interpréter de nouveau les données, il faut appliquer la transformation inverse.

La transformation pour réduire la taille des données est appelée « compression ». À l'inverse, la transformation pour retrouver les données lisibles s'appelle la « décompression ».
Pour compresser des données, on utilise un compresseur et pour les décompresser, on utilise un décompresseur.

Il faut donc un binôme Compresseur/ Decompresseur (appelé CoDec) pour réduire la taille des données puis les lire de nouveau.

Avec le développement des différentes techniques de compression, deux catégories se sont imposées.
  • La compression réversible (ou compression sans perte) ;
  • La compression irréversible (ou compression avec perte).
Pour illustrer le principe général de ces deux familles, reprenons le très bon exemple issu du livre « DICOM, A Practical Introduction and Survival Guide » d'Oleg S. Pianykh.

1.1 Compression sans perte


La compression sans perte permet de ne pas changer des données. Ainsi, une fois l'opération de compression et de décompression effectuée, les données sont les mêmes que si aucune transformation n'avait été appliquée.

Pour avoir une idée générale de comment il est possible d'effectuer une compression sans perte, prenons l'exemple suivant:

Supposons que l'on dispose de la suite de valeur de pixels suivante:

1000, 1001, 1002, 1002, 1000, 1000, 1001, 1057, ...

Un algorithme de compression sans perte pourrait être d'exploiter la répétitivité de la valeur la plus fréquente en la remplaçant par quelque chose de plus court. Par exemple, remplacer la chaîne « 1000 » par le caractère « a ». On obtiendrait donc :

a, 1001, 1002, 1002, a,  a, 1001, 1057, ...

La chaîne « a » étant plus courte que la chaîne « 1000 », la longueur globale est donc plus petite.
Il est toujours possible de décompresser le résultat et retrouver la suite originale en remplaçant les « a » par « 1000 ».

Remarque: Le codage de Huffman ou le Run Length Encoding (RLE) sont des exemples d'algorithmes de compression sans perte.

1.2 Compression avec perte


La compression avec perte va sacrifier des données pour obtenir un meilleur taux de compression. Ainsi, une fois l'opération de compression et de décompression effectuée, les données retrouvées ne sont pas les mêmes que les données originales.

Prenons deux couleurs très similaires dont les valeurs RGB sont:
Ces deux couleurs peuvent sembler identiques visuellement car le changement est tellement petit que l’œil humain n'arrive pas à les distinguer.  Une technique de compression avec perte est de jouer sur ces petits changements imperceptibles.

Reprenons la suite de valeurs de pixels ci-dessus:

1000, 1001, 1002, 1002, 1000, 1000, 1001, 1057, ...

« 1000 » et « 1001 » sont très proches. Tellement proches que la différence est négligeable. Nous allons donc remplacer la chaîne « 1001 » par « 1000 ».
On obtient donc:

1000, 1000, 1002, 1002, 1000, 1000, 1000, 1057, ...

En appliquant le même algorithme de compression sans perte que ci-dessus (remplacer « 1000 » par « a »), on obtient la suite :

a, a, 1002, 1002, a, a, a, 1057, ...

Le résultat est donc encore plus court que précédemment (meilleur taux de compression). En revanche en décompressant cette suite, nous sommes incapable de dire quel « a » représentait un « 1000 » et quel autre « a » représentait un « 1001 ». Une fois décompressé, la suite est différente de l'originale (même si visuellement aucune différence n'est notable). En finalité, nous avons donc perdu (sacrifié) des données pour une meilleure compression.

Remarque: La transformée en cosinus discrète (TCD) est un exemple d'algorithme de codage avec perte. Il est utilisé par JPEG (et par DICOM) pour sacrifier des données et obtenir un meilleur taux de compression (cf. PS3.5 Annexe F.1).

Conseil: Le format d'image BMP par exemple est non destructeur alors que le format JPEG est quant à lui destructeur (sacrifice de données). C'est pourquoi, il est préférable de travailler sur une image BMP et de l'enregistrer en JPEG à la fin, plutôt que de travailler sur une image en JPEG et qu'à chaque enregistrement (pour sauvegarder les changements de manière périodique) on dégrade un peu plus l'image.

3. Encodage d'une image en DICOM


Les tags évoqués dans la première partie sont toujours valables. La seule contrainte est que ces derniers soient cohérent par rapport à l'image (voir remarque ci-dessous). Seul l'utilisation du tag (7FE0, 0010) Pixel Data change. La description détaillé de cet élément DICOM est décrite dans la partie PS3.5 Annexe A.4 du standard.

Remarque: Les valeurs mentionnées dans les éléments de données spécifiant l'encodage d'une image (Photometric Interpretation, Samples per Pixel, Planar Configuration, Bits Allocated, Bits Stored, High Bit, Pixel Representation, Rows, Colums, etc.) doivent être cohérents avec ceux qui apparaissent dans le flux d'octets de l'image compressée. Toutefois, en cas d'inconsistance, il est recommandé que le processus de décodage utilise les paramètres mentionnés dans le flux d'octets représentant les données compressées.

3.1. Généralité


Lorsque l'on utilise une technique de compression (avec ou sans perte) pour stocker les pixels d'une image, le standard indique que l'encodage DICOM doit toujours se faire en Little Endian et en Explicit VR (cf. PS3.5 - Annexe A.4).

3.2. Pixel Data


Comme pour les images natives, le tag (7FE0, 0010) Pixel Data permet de stocker les pixels d'une ou plusieurs images. Il existe néanmoins des contraintes sur cet élément pour les images encapsulées:
  • La VR doit être « OB » (Other Bytes). Il n'est pas possible d'utiliser une VR de type « OW » (Other Words) ;
  • Pixel Data doit contenir le flux d'octet exprimant l'image compressée (entête comprise) ;
  • Contrairement aux images natives qui stockent directement les pixels dans l'élément (7FE0, 0010) Pixel Data, il faut impérativement utiliser une séquence DICOM pour stocker les pixels compressés (d'où le nom « Encapsulated Image »). De plus, la séquence doit respecter les contraintes suivantes:
    • L'encodage de la séquence doit se faire en « Undefined Length » ;
    • Le premier élément de la séquence doit être une « Basic Offset Table » ;
    • Les autres éléments de la séquence sont les pixels de l'image (ou des images dans le cas d'une Multi-frame).
Autre point important, une image peut être fragmentée en plusieurs parties. Chacune de ces dernières faisant l'objet d'un item de la séquence.

Quelques mots sur la fragmentation d'image : Une image peut être entièrement contenue dans un item, ou être divisée dans plusieurs parties. Cette fragmentation permet de supporter la bufferisation pendant la compression d'une image ou d'éviter de dépasser la taille maximum d'un fragment. Un logiciel voulant lire une image DICOM peut détecter la fragmentation d'une image en comparant le nombre de fragments (nombre d'items -1 pour la Basic Offset Table) avec le nombre d'images (tag (0028,0008) Number of Frames).

Remarque: Les tags (7FE0,0008) Float Pixel Data et (7FE0,0009) Double Float Pixel Data ne peuvent pas être utilisés pour stocker des images compressées. Ces deux Data Element ne peuvent stocker que des données au format Natif (cf. PS3.5 - section 8.2).

3.2.1 L'item Basic Offset Table (premier item de la séquence)


Cet item est obligatoire, mais sa valeur est optionnelle. Si la valeur est présente, elle contient, pour chaque image, l'offset du premier octet du premier fragment (item) de chacune des images. L'offset est calculé à partir du premier octet du premier item après la Basic Offset Table. Chaque offset est codé sur 32 bits (4 octets).

Remarque: Lorsque la valeur n'est pas présente, la longueur de l'item doit être 0000H.

Des exemples sont disponibles dans la section 3.2.3. ci-dessous.

3.2.2 Les autres items (suivant le premier item)


L'encodage de chaque item se fait en « Explicit Length » et de la manière suivante:
  • Le champ « Tag » doit avoir la valeur (FFFE, E000) ;
  • Le champ « Length » de 4 octets doit contenir le nombre d'octets contenu dans le champ « Value » ;
  • Le champ « Value » contient le flux d'octets (ou une partie du flux d'octets) représentant l'image compressée ;
  • Le champ « Value » doit toujours avoir une longueur paire. La valeur peut donc être complétée par le caractère NULL (cf. L'encodage d'objet DICOM - Format Classique (Partie 1)).

3.2.3 Exemples d'encodage d'une séquence


3.2.3.1. Exemple d'encodage d'une image (single frame) définie avec une séquence de trois fragments sans Basic Offset Table

Tag VR Longueur Valeur
(7FE0, 0010)
avec une VR
de OB
OB 0000H
Réservé
FFFF FFFFH
longueur indéfinie
Basic Offset Table SANS Valeur 1er Fragment (Single Frame) des pixels
Tag Longueur Tag Longueur Valeur
(FFFE, E000) 0000 0000H (FFFE, E000) 0000 04C6H Fragment Compressé
4 octets 2 octets 2 octets 4 octets 4 octets 4 octets 4 octets 4 octets 04C6H octets

Suite de la séquence (Valeur)
2d Fragment (Single Frame) de pixels 3ème Fragment (Single Frame) de pixels Sequence Delimiter Item
Tag Longueur Valeur Tag Longueur Valeur Sequence Delim. Tag Longueur
(FFFE, E000) 0000 024AH Fragment Compressé (FFFE, E000) 0000 0628H Fragment Compressé (FFFE,  E0DD) 0000 0000H
4 octets 4 octets 024AH octets 4 octets 4 octets 0628H octets 4 octets 4 octets

C.2.3.2. Exemple d'encodage d'une Multi-frame de 2 images définie avec une séquence de trois fragments avec Basic Offset Table

Tag VR Longueur Valeur
(7FE0, 0010)
avec une VR
de OB
OB 0000H
Réservé
FFFF FFFFH
longueur indéfinie
Basic Offset Table AVEC Valeur 1er Fragment (Frame 1) de pixels
Tag Longueur Valeur Tag Longueur Valeur
(FFFE, E000) 0000 0008H 0000 0000H
0000 0646H
(FFFE, E000) 0000 02C8H Fragment
Compressé
4 octets 2 octets 2 octets 4 octets 4 octets 4 octets 0008H octets 4 octets 4 octets 02C8H octets

Suite de la séquence (Valeur)
2d Fragment (Frame 1) de pixels 3ème Fragment (Frame 2) de pixels Sequence Delimiter Item
Tag Longueur Valeur Tag Longueur Valeur Sequence Delimiter Tag Longueur
(FFFE, E000) 0000 036EH Fragment
Compressé
(FFFE, E000) 0000 0BC8H Fragment
Compressé
(FFFE, E0DD) 0000 0000H
4 octets 4 octets 036EH octets 4 octets 4 octets 0BC8H octets 4 octets 4 octets

Remarque: DICOM autorise l'encodage (la compression) des pixels d'une image dans certains formats. Par exemple, il n'est pas possible d'utiliser les formats PNG ou ZIP, mais il est possible d'utiliser les formats JPEG et RLE. Ces formats sont décrits dans la seconde sous-partie consacrée à la compression des images en DICOM.

4. Exemples de fichiers

5. Quelques remarques sur l'imagerie médicale et la compression

  • Le standard DICOM ne donne aucune indication sur comment utiliser les différentes compressions disponibles. C'est en effet en dehors du périmètre du standard. De plus, beaucoup trop de paramètres entrent en jeux pour indiquer quelle compression utiliser sur telle ou telle image (type d'image, qualité de l'image, etc.). Malgré cette absence d'indication dans le standard, une règle de bonne pratique est que quelque soit le schéma de compression, il est déconseillé d'utiliser un codec propriétaire pour l'archivage. Cela pourrait mener à des problèmes d'interopérabilités et de migrations.
  • Il y a souvent une incompréhension sur la taille des fichiers DICOM lorsque ces derniers sont encapsulés. En effet, ce n'est pas parce qu'un fichier fait 30 Mo que cela indique qu'une fois chargée en mémoire, l'image fera effectivement 30 Mo. Si le ratio de compression et de 10:1. Alors une fois décompressée, l'image fera 300 Mo. Charger une série ou un examen DICOM en entier peut vite mettre à genoux un ordinateur si celui est sous dimensionné.
  • Autre point important, ce n'est pas parce que l'on compresse une image pour en réduire la taille que le transfert réseau se fera plus rapidement. En effet, compresser et décompresser une image consomme du processeur et du temps. Si le temps de compression + le temps de transfert + le temps de décompression est supérieur ou égal au temps de transfert de l'image sans technique de compression, alors le gain est nul, voir négatif.