2016-11-08 2 views
1

Für Leute, die nicht wissen, was eine DICOM-Datei ist, ist es eine Datei, die medizinische Bildgebungsdaten über Patienten enthält. Es enthält die Patientendaten und einige Pixeldaten. Alles, was Sie wissen müssen, ist, dass die Pixeldaten in der gleichen Datei sind, aber vom Rest der Patientendaten getrennt sind.JPEG komprimierte Pixeldaten zu Raw Pixeldaten

Ich habe ein Programm gemacht, das RAW-Pixeldaten in DICOM-Dateien lesen kann. Die Pixeldaten werden jedoch häufig unter Verwendung der JPEG-Komprimierung komprimiert. Hier ist das Wörterbuch, das ich verwende, um die Methode des Pixel Kompression zu wissen:

using System.Collections.Generic; 

namespace DICOMViewer.Parsing 
{ 
    public static class TransferSyntaxDictionary 
    { 
     // DICOM Transfer Syntax Dictionary 
     // Reference: DCIOM Standard 2009, Part 5: Data Structures and Encoding 

     static private readonly Dictionary<string, string> d = new Dictionary<string, string> 
     { 
      { "1.2.840.10008.1.2", "Implicit VR Little Endian: Default Transfer Syntax for DICOM" }, 
      { "1.2.840.10008.1.2.1", "Explicit VR Little Endian" }, 
      { "1.2.840.10008.1.2.1.99", "Deflated Explicit VR Little Endian" }, 
      { "1.2.840.10008.1.2.2", "Explicit VR Big Endian" }, 
      { "1.2.840.10008.1.2.4.50", "JPEG Baseline (Process 1): Default Transfer Syntax for Lossy JPEG 8 Bit Image Compression" }, 
      { "1.2.840.10008.1.2.4.51", "JPEG Extended (Process 2 & 4): Default Transfer Syntax for Lossy JPEG 12 Bit Image Compression (Process 4 only)" }, 
      { "1.2.840.10008.1.2.4.52", "JPEG Extended (Process 3 & 5)" }, 
      { "1.2.840.10008.1.2.4.53", "JPEG Spectral Selection, Non-Hierarchical (Process 6 & 8)" }, 
      { "1.2.840.10008.1.2.4.54", "JPEG Spectral Selection, Non-Hierarchical (Process 7 & 9)" }, 
      { "1.2.840.10008.1.2.4.55", "JPEG Full Progression, Non-Hierarchical (Process 10 & 12)" }, 
      { "1.2.840.10008.1.2.4.56", "JPEG Full Progression, Non-Hierarchical (Process 11 & 13)" }, 
      { "1.2.840.10008.1.2.4.57", "JPEG Lossless, Non-Hierarchical (Process 14)" }, 
      { "1.2.840.10008.1.2.4.58", "JPEG Lossless, Non-Hierarchical (Process 15)" }, 
      { "1.2.840.10008.1.2.4.59", "JPEG Extended, Hierarchical (Process 16 & 18)" }, 
      { "1.2.840.10008.1.2.4.60", "JPEG Extended, Hierarchical (Process 17 & 19)" }, 
      { "1.2.840.10008.1.2.4.61", "JPEG Spectral Selection, Hierarchical (Process 20 & 22)" }, 
      { "1.2.840.10008.1.2.4.62", "JPEG Spectral Selection, Hierarchical (Process 21 & 23)" }, 
      { "1.2.840.10008.1.2.4.63", "JPEG Full Progression, Hierarchical (Process 24 & 26)" }, 
      { "1.2.840.10008.1.2.4.64", "JPEG Full Progression, Hierarchical (Process 25 & 27)" }, 
      { "1.2.840.10008.1.2.4.65", "JPEG Lossless, Hierarchical (Process 28)" }, 
      { "1.2.840.10008.1.2.4.66", "JPEG Lossless, Hierarchical (Process 29)" }, 
      { "1.2.840.10008.1.2.4.70", "JPEG Lossless, Non-Hierarchical, First-Order Prediction (Process 14 [Selection Value 1]): Default Transfer Syntax for Lossless JPEG Image Compression" }, 
      { "1.2.840.10008.1.2.4.80", "JPEG-LS Lossless Image Compression" }, 
      { "1.2.840.10008.1.2.4.81", "JPEG-LS Lossy (Near-Lossless) Image Compression" }, 
      { "1.2.840.10008.1.2.4.90", "JPEG 2000 Image Compression (Lossless Only)" }, 
      { "1.2.840.10008.1.2.4.91", "JPEG 2000 Image Compression" }, 
      { "1.2.840.10008.1.2.4.92", "JPEG 2000 Part 2 Multi-component Image Compression (Lossless Only)" }, 
      { "1.2.840.10008.1.2.4.93", "JPEG 2000 Part 2 Multi-component Image Compression" }, 
      { "1.2.840.10008.1.2.4.94", "JPIP Referenced" }, 
      { "1.2.840.10008.1.2.4.95", "JPIP Referenced Deflate" }, 
      { "1.2.840.10008.1.2.4.100", "MPEG2 Main Profile @ Main Level" }, 
      { "1.2.840.10008.1.2.5", "RLE Lossless" }, 
      { "1.2.840.10008.1.2.6.1", "RFC 2557 MIME encapsulation" } 
     }; 

     static public string GetTransferSyntaxName(string theTransferSyntaxUID) 
     { 
      return d.ContainsKey(theTransferSyntaxUID) ? d[theTransferSyntaxUID] : "???"; 
     } 
    } 
} 

Wie Sie sehen, es gibt 26 verschiedene Arten von JPEG-Kompressionsverfahren, die ich dekomprimieren will (die alle einen Schlüssel von 1.2.840.10008 haben. 1.2.4.xx). Zusammenfassend habe ich einige Pixeldaten (als MemoryStream) komprimiert mit einem JPEG-Komprimierungsalgorithmus, den ich in RAW-Pixeldaten dekomprimieren möchte. Ich weiß nicht einmal, wo ich anfangen soll! Das ist irgendwie frustrierend.

Einige Leute würden gerne wissen, was ich versucht habe: Ich versuchte LibJpeg.NET zu verwenden, aber wenn ich die jpeg_decompress_struct.jpeg_read_header(bool require_image) Funktion aufrufen, erhalte ich eine Ausnahme: Not a JPEG file: starts with 0xFE 0xFF

Antwort

1

DICOM unterstützt fast alle der ITU 81 standard, während der berühmte libjpeg (in seiner allgemeinen Binärdistribution [*]) unterstützt nur 8bits huffman & sequentiell.

Sie benötigen eine andere JPEG-Bibliothek verwendet werden, die zumindest zu unterstützen:

  • 8/12 Bits Huffman & sequentielle
  • 16bits lossless

Zum Vergleich:

[*] Wenn Sie den Quellcode herunterladen, werden Sie in der Lage sein, die 12bits Huffman/sequentielle Binärdateien zu kompilieren.


EDIT: In der Tat Ihre Frage Re-Lektüre, ich entdecken Sie nicht mit Fragmenten überhaupt zu tun haben, damit die berühmte 0xFE 0xFF Fehlermeldung. Sie sollten den DICOM-Standard lesen, da er mit trivial examples geliefert wird.

0

Die meisten der Transfersyntax, die aufgelistet sind, sind im Ruhestand, so dass der DICOM-Standard diese Art der Komprimierung nicht als gültig kennt.

  • 1.2.840.10008.1.2.4.52 Ruhestand
  • 1.2.840.10008.1.2.4.53 Retired
  • 1.2.840.10008.1.2.4.54 Retired
  • 1.2.840.10008.1.2.4.55 Retired
  • 1.2.840.10008.1.2.4.56 Zurückgezogen
  • 1.2.840.10008.1.2.4.Retired 57
  • 1.2.840.10008.1.2.4.58 Retired
  • 1.2.840.10008.1.2.4.59 Retired
  • 1.2.840.10008.1.2.4.60 Retired
  • 1.2.840.10008.1.2.4.61 Retired
  • 1,2 .840.10008.1.2.4.62 Ruhestand
  • 1.2.840.10008.1.2.4.63 Retired
  • 1.2.840.10008.1.2.4.64 Retired
  • 1.2.840.10008.1.2.4.65 Retired
  • 1.2.840.10008.1.2.4.66 Zurückgezogen

Sie müssen es also nicht unterstützen. Vielleicht möchten Sie alte Bilder unterstützen, aber denken Sie daran, dass viele von ihnen in der Vergangenheit nicht wirklich genutzt werden und seit 2006 im Ruhestand sind!

Außerdem muss jedes DICOM-Gerät einer DICOM Conformance Statement zugeordnet sein, wo unter anderem die Übertragung sysntax-Unterstützung deklariert wird. Sie müssen nicht alle DICOM-Transfersyntax unterstützen, sondern nur diejenigen, die Sie in Ihrer Conformance-Anweisung deklariert haben. Zum Beispiel unterstützt nicht alle DICOM Geräte Jpeg2000 oder Jpeg LS

+0

Ich werde Scans von Patienten verwenden, die ein paar Tage vor dem Öffnen gemacht wurden. Meinst du, dass all diese Syntax nicht mehr benutzt werden kann? Weil ich in einem irgendwie unentwickelten Land bin. Wird das ein Problem sein @Alessandro? – None

+0

Wenn Sie an einem bestimmten Projekt auf einer Site arbeiten, können Sie untersuchen, welche DICOM-Geräte Sie unterstützen müssen (DICOM Conformance-Anweisungen von DICOM-Geräten müssen öffentlich sein). In diesem glücklichen Fall können Sie nicht nur die Übertragungssyntax kennen, sondern auch alles über zugewiesene Bild-Bits, gespeicherte Bits, Farbräume usw. Die am häufigsten verwendete Übertragungssyntax sind jedoch: –

+0

- 1.2.840.10008.1.2.4.50 extended2 (8-Bit), 4 (12-Bit) - 1.2.840.10008.1.2.4.51 verlustfrei, nicht-hierarchisch141.2.840.10008.1.2.4.57 verlustfrei, nicht hierarchisch, Vorhersage erster Ordnung14 (Auswahlwert 1) 1.2.840.10008.1.2 .4.70 –

Verwandte Themen