当前位置: 首页 > 知识库问答 >
问题:

JPEG压缩像素数据到原始像素数据

顾喜
2023-03-14

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

我做了一个程序,可以读取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压缩算法进行压缩,我想将其解压缩为原始像素数据。我都不知道从何说起!这有点让人沮丧。

有些人想知道我尝试了什么:我尝试使用libjpeg.net,但是当我调用jpeg_decompress_struct.jpeg_read_header(bool require_image)函数时,我得到一个异常:不是JPEG文件:以0xFE 0xFF开头

共有1个答案

闻法
2023-03-14

DICOM支持几乎所有的ITU81标准,而著名的libjpeg(其常用的二进制发行版[*])只支持8bits的huffman&Sequential。

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

  • 8/12位哈夫曼序列
  • 16位无损

供参考:

  • libJPEG和无损JPEG
  • DICOM中的JPEG无损
  • C#:使用Silverlight FJCore库以12位精度解码JPEG图像?

[*]如果下载了源代码,就可以编译12bits的Huffman/Sequential二进制文件。

 类似资料:
  • JPEG或PNG是否支持元数据/辅助数据的压缩? 到目前为止,我读到的所有内容都集中在图像压缩上,我找不到任何关于扩展数据压缩的内容。 大多数压缩软件似乎会移除元数据,但是否有可能将其压缩呢?

  • 我希望加载一个dicom图像并将其保存到jpeg,如下面的fo-dicom文档代码所示: 但是,我正在从MemoryStream打开dicom文件,我想将jpeg保存为字节数组。这在FO-DICOM中是可能的吗?

  • 我得到了一个字节数组,存储了一个已经解构的DICOM文件中的16位像素数据。我现在需要做的是以某种方式将像素数据转换/导出为TIFF文件格式。我使用imageio-tiff-3.3.2.jar插件来处理tiff转换/头数据。但是现在我需要将该图像数据数组打包到原始图像维度的BufferedImage中,以便将其导出到TIFF。但是BufferedImage似乎不支持16位图像。有没有办法解决这个问

  • 我想我已经找到了一种方法,可以使用素数进行无损压缩,或者反复使用其他方法。 0-255范围内有54个素数,当我们在字节数组中有素数时,我们可以使用该数的素数索引来存储它,使用6位而不是8位,对吗? 我们需要为每个字节创建一个映射,我们可以存储压缩的数字,并将其添加到数据数组中。 起初,这似乎可行,但会略微增加文件大小,但对于LZ4或Huffman之类的算法,会将文件减少为可重新压缩的结构。 索引0

  • 我试图在Java程序中打开jpeg文件,并注意到ImageIO和Apache commons imaging library工具都无法打开图像。commons库向我显示了以下错误: “目前只支持顺序的基线JPEG” 提前致谢

  • 我想还有另一种方法,因为我们公司有一个扫描仪,可以产生尺寸小得多的JPEG压缩的TIFF图像。有没有人知道另一个库(免费或不免费)可以更有效地处理这种转换,或者在FreeImage中实现这一点? 更新: 我查看了TIFF6.0规范,分析了扫描器生成的文件,并能够编写一个函数,将JPEG包装到一个非常简单的TIFF容器中(也可以处理合并到多页TIFF中的多个JPEG)。 我知道可能有些陷阱我还不知道