2016-11-08 166 views
1

对于不知道DICOM文件是什么的人来说,它是保存有关患者的医学影像数据的文件。它包含患者数据和一些像素数据。您只需要知道像素数据在同一个文件中,但与患者其余数据分开。将JPEG压缩像素数据转换为原始像素数据

我做了一个程序,可以在DICOM文件中读取原始像素数据。但是,像素数据通常使用JPEG压缩进行压缩。下面是我使用以便知道像素压缩的方法字典:

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] : "???"; 
     } 
    } 
} 

正如你看到的有26种不同类型的,我想解压缩JPEG压缩方法(所有那些具有1.2.840.10008的关键。 1.2.4.xx)。总之,我有一些像素数据(作为MemoryStream)使用JPEG压缩算法压缩,我想解压缩为RAW像素数据。我甚至不知道从哪里开始!这有点令人沮丧。

有些人想知道我曾尝试: 我试图用LibJpeg.NET,但是当我打电话jpeg_decompress_struct.jpeg_read_header(bool require_image)功能我得到一个异常:Not a JPEG file: starts with 0xFE 0xFF

回答

1

DICOM支持几乎所有的ITU 81 standard,而着名的libjpeg(在其常见的二进制分发[*]中)仅支持8位huffman &顺序。

您需要使用另一个JPEG库,它至少支持:

  • 8/12位霍夫曼&顺序
  • 16位无损

参考:

[*]如果你下载的源代码,你就可以编译12位霍夫曼/顺序二进制文件。


编辑:其实重新阅读你的问题,我发现你不与片段处理所有,因此著名0xFE 0xFF错误消息。您应该阅读DICOM标准,因为它带有trivial examples

0

大多数列出的传输语法已经过时,因此DICOM标准并不知道这种压缩类型是有效的。

  • 1.2.840.10008.1.2.4.52退休
  • 1.2.840.10008.1.2.4.53退休
  • 1.2.840.10008.1.2.4.54退休
  • 1.2.840.10008.1.2.4.55退休
  • 1.2.840.10008.1.2.4.56退役
  • 1.2.840.10008.1.2.4。57不再更新
  • 1.2.840.10008.1.2.4.58退休
  • 1.2.840.10008.1.2.4.59退休
  • 1.2.840.10008.1.2.4.60退休
  • 1.2.840.10008.1.2.4.61退休
  • 1.2 .840.10008.1.2.4.62退休
  • 1.2.840.10008.1.2.4.63退休
  • 1.2.840.10008.1.2.4.64退休
  • 1.2.840.10008.1.2.4.65退休
  • 1.2.840.10008.1.2.4.66退役

所以你不需要支持它。也许你想支持旧图像,但请记住,其中许多过去并不真正使用,并从2006年退休!

此外,每个DICOM设备都必须与DICOM一致性声明关联,声明其中包括传输sysntax支持。您不需要支持所有DICOM传输语法,而只需要在您的一致性声明中声明的那些语法。例如,并非所有DICOM设备都支持Jpeg2000或Jpeg LS

+0

我打算在打开它之前使用几天的患者扫描。你的意思是说所有这些语法不能再被使用了吗?因为我处于一个不发达的国家。那会是一个问题@Alessandro? – None

+0

如果您正在某个站点中的某个特定项目上工作,您可以调查哪些是您需要支持的DICOM设备(DICOM设备的一致性声明必须公开)。在这个幸运的例子中,您不仅可以知道传输语法,还可以知道关于映像所分配的位,存储的位,颜色空间等等的所有内容......然而,最常用的传输语法是: –

+0

- 1.2.840.10008.1.2.4.50 extended2(8位),4(12位) - 1.2.840.10008.1.2.4.51无损,非分层141.2.840.10008.1.2.4.57无损,非分层,一阶预测14(选择值1)1.2.840.10008.1.2 .4.70 –