对于不知道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)函数时,我得到了一个异常:Not a JPEG file: starts with 0xFE 0xFF
发布于 2016-11-09 14:53:04
DICOM支持几乎所有的ITU 81 standard,而著名的libjpeg (在其常见的二进制发行版*中)只支持8位霍夫曼和顺序。
您需要使用另一个至少支持以下内容的JPEG库:
供参考:
*如果您下载源代码,您将能够编译12位霍夫曼/顺序二进制文件。
编辑:事实上,重新阅读您的问题,我发现您根本没有处理片段,因此出现了著名的0xFE 0xFF错误消息。您应该阅读DICOM标准,因为它附带了trivial examples。
发布于 2016-11-09 16:58:46
列出的大多数传输语法都已停用,因此DICOM标准不知道这种压缩是有效的。
所以你不需要支持它。也许你想支持老的图像,但请记住,它们中的许多在过去并没有真正使用过,并且从2006年起就停用了!
此外,每个DICOM设备都必须与DICOM一致性声明相关联,其中声明了传输系统支持等。您不需要支持所有的DICOM传输语法,只需要支持您在一致性声明中声明的语法。例如,并非所有的DICOM设备都支持Jpeg2000或Jpeg LS
发布于 2021-05-27 05:04:48
DICOM压缩图像像素数据不像JPEG文件那样具有标准图像标头。列、行、位像素等像素信息仅在DICOM数据集属性值中直接编码,数据集PixelData属性值包含经过特殊编码的压缩字节流。检查DICOM标准PS3.5附录A-传输语法,特别要注意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-LS这样的JPEG扩展实现MCU编码/解码逻辑。
如果你决定不走这条路,第二个解决方案就是重建丢失的头文件。我决定不这样做,因为大多数库实际上不支持这种压缩(至少在我的经验中是这样),而且实际上支持它的库非常庞大(支持大量其他我们实际上不需要的东西)。但这两条路都通向学习JPEG编码过程的内部。
第三,最后的解决方案是找到一些能够做到这一点的开源项目,我想到目前为止,网上应该有更多的开源项目。
希望这对其他寻找类似答案的人有所帮助。
https://stackoverflow.com/questions/40495327
复制相似问题