我多年前写了一个JPEG压缩/解压程序,可以处理无损和有损的JPEG文件。它工作得很好,但并不总是正确地解码DICOM文件中的JPEG流。
我对JPEG很熟悉,但对DICOM知之甚少。DICOM中的无损JPEG不可能符合JPEG ISO标准。必须进行一些修改,无论是硬编码还是通过DICOM文件中JPEG文件流外部的某个参数进行修改。
我的代码在大多数样本DICOM文件(compsamples_jpeg.tar)上失败了,请参见: ftp://medical.nema.org/MEDICAL/Dicom/DataSets/WG04/ 这是当我解码此集合中第一个无损JPEG(IMAGES\JPLL\CT1_JPLL)时发生的情况: dicom decoded image 左侧图像由我的代码呈现,右侧图像由在线DICOM阅读器呈现: www (dot) ofoct (dot) com (slash) viewer (slash) dicom-viewer-online (dot) html
(x)MedCon是一个开源的DICOM阅读器,在像素级别上与我的代码出现了相同的问题,所以我不是唯一一个遇到这个问题的人。 xmedcon点sourceforge点net
我逐字节阅读了这个jpeg流,画出了霍夫曼树并计算了霍夫曼编码,我的代码完全按照预期运行。以下是霍夫曼编码:
0 00 4 01 3 100 5 101 1 1100 2 1101 6 1110 7 11110 8 111110 9 1111110 12 11111110 11 111111110 10 1111111110 15 11111111110
以下是SOS标记后的压缩数据:
我确信我对jpeg有很好的理解,但是DICOM中的jpeg流似乎不遵循jpeg标准。嵌入DICOM文件时对jpeg流进行了哪些扩展/更改?
我对JPEG很熟悉,但对DICOM知之甚少。DICOM中的无损JPEG不可能符合JPEG ISO标准。必须进行一些修改,无论是硬编码还是通过DICOM文件中JPEG文件流外部的某个参数进行修改。
我的代码在大多数样本DICOM文件(compsamples_jpeg.tar)上失败了,请参见: ftp://medical.nema.org/MEDICAL/Dicom/DataSets/WG04/ 这是当我解码此集合中第一个无损JPEG(IMAGES\JPLL\CT1_JPLL)时发生的情况: dicom decoded image 左侧图像由我的代码呈现,右侧图像由在线DICOM阅读器呈现: www (dot) ofoct (dot) com (slash) viewer (slash) dicom-viewer-online (dot) html
(x)MedCon是一个开源的DICOM阅读器,在像素级别上与我的代码出现了相同的问题,所以我不是唯一一个遇到这个问题的人。 xmedcon点sourceforge点net
我逐字节阅读了这个jpeg流,画出了霍夫曼树并计算了霍夫曼编码,我的代码完全按照预期运行。以下是霍夫曼编码:
0 00 4 01 3 100 5 101 1 1100 2 1101 6 1110 7 11110 8 111110 9 1111110 12 11111110 11 111111110 10 1111111110 15 11111111110
以下是SOS标记后的压缩数据:
- ff 00 de 0c 00 (ff后的00是填充字节)
- 11111111 11011110 00001100 00000000
- 11111111110 si=15
- 111100000110000 diff=30768
在线查看器显示第一个像素值为-3024。如果正确,第一个diff值应为-3024,但不是。
此后,我的代码正确解码了大约2/5的图像,但随后解码出一个极不准确的diff值:
- d2 a1 fe ff 00 e0 (ff后的00是填充字节)
1010111 10100001 11111110 11111111 11100000
101 si=5
- 01111 diff=-16
- 01 si=4
- 0000 diff=-15
- 111111110 si=11 ????
- 11111111111 diff=2047
我确信我对jpeg有很好的理解,但是DICOM中的jpeg流似乎不遵循jpeg标准。嵌入DICOM文件时对jpeg流进行了哪些扩展/更改?