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
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
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: –
- 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 –