【问题标题】:JPEG compressed pixel data to Raw Pixel dataJPEG 压缩像素数据到原始像素数据
【发布时间】:2017-03-22 13:49:36
【问题描述】:

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

我做了一个程序,可以读取 DICOM 文件中的 RAW 像素数据。然而,像素数据经常使用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

【问题讨论】:

    标签: c# compression jpeg dicom libjpeg


    【解决方案1】:

    DICOM 压缩图像像素数据没有像 JPEG 文件那样的标准图像标题。 列、行、bitsperpixel 等像素信息仅直接编码在 DICOM Data-Set Attribute 值中,Data-Set PixelData Attribute 值包含经过特殊编码的压缩字节流。 检查DICOM Standard PS 3.5 Annex A - Transfer Syntax,特别注意A.4 http://dicom.nema.org/medical/dicom/current/output/chtml/part05/sect_A.4.html

    话虽如此,我在定位能够解码和编码 JPEG 无损非分层级别 14 和预测器选定值 1(本机 JPEG 无损压缩的 DICOM)的库时遇到了同样的问题。事实证明,这可以从 ITU-T.81 标准轻松实现(可以从 1998 年或类似的许多地方下载)。仅使用 DICOM 标准指定的标准,我在一周内设法编写了编码器/解码器编解码器,不是一个而是两个。我只使用查找表,它工作得非常快。想想一旦你构建下一个会容易得多,因为你有 JPEG 读/写基础设施,唯一需要注意的是实现 JPEG 扩展的 MCU 编码/解码逻辑,如 JPEG-LS。

    如果您决定不走这条路,第二个解决方案是重建丢失的标头。我决定不这样做,因为大多数库实际上不支持这种压缩(至少我的经验),而实际支持它的库非常庞大(支持大量我们实际上不需要的其他东西)。 但无论如何,这两条路都会导致学习 JPEG 编码过程的内部。

    倒数第三个解决方案是找到一些能够做到这一点的开源项目,我想现在网上应该有更多可用的项目。

    希望这可以帮助其他寻找类似答案的人。

    【讨论】:

      【解决方案2】:

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

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

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

      供参考:

      [*] 如果您下载源代码,您将能够编译 12 位 huffman/sequential 二进制文件。


      编辑:事实上,重新阅读您的问题,我发现您根本没有处理 Fragments,因此著名的 0xFE 0xFF 错误消息。您应该阅读 DICOM 标准,因为它带有 trivial examples

      【讨论】:

        【解决方案3】:

        列出的大多数传输语法都已停用,因此 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

        【讨论】:

        • 我将使用打开前几天对患者进行的扫描。你的意思是所有这些语法都不能再使用了吗?因为我在一个不发达国家。 @Alessandro 这会是个问题吗?
        • 如果您正在处理站点中的特定项目,您可以调查哪些是您需要支持的 DICOM 设备(DICOM 设备的 DICOM 一致性声明必须是公开的)。在这种幸运的情况下,您不仅可以了解传输语法,还可以了解有关分配的图像位、存储的位、颜色空间等的所有信息……但是最常用的传输语法是:
        • - 1.2.840.10008.1.2.4.50 extended2(8-bit),4(12-bit)- 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
        • 该程序将被全球医生使用,患者可以从任何地方进行扫描。因此,我认为 Ii 应该支持所有语法。
        • 我认为你必须支持我在上面评论中写的传输语法,当然是解压缩的(隐式和显式小端序)。 Jpeg LS 用的不多,JPIP 也用的不多……Jpeg2000 多一点。这取决于您要显示哪种图像:静态或多帧、US、CT。请记住,如果您只完全支持您在 DICOM 符合性声明中声明的传输语法,那么没有人可以说您不符合 DICOM 标准
        猜你喜欢
        • 2012-10-06
        • 1970-01-01
        • 2018-08-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-05-22
        • 2011-08-09
        • 2014-03-29
        相关资源
        最近更新 更多