2

在我的 C# Silverlight 应用程序中,我尝试使用FJCore类库以压缩的 JPEG 传输语法解码 DICOM 图像。

DICOM 图像通常以 12 位精度压缩。当尝试使用原始 FJCore 源代码解码这样的图像时,我得到一个异常说“不支持的编解码器类型”,因为在原始 FJCore 实现中只有 SOF0(基线 DCT)和 SOF2(渐进式 DCT)帧开始标记是支持的。如果我将实现更改为也接受 SOF1 标记(扩展顺序 DCT)并将 SOF1 帧以与 SOF0 帧相同的方式处理,则图像被解码,但只考虑 8 位。

使用修改后的 FJCore 库解码后,典型的 12 位精度图像现在如下所示:

由 FJCore 编码为 8 位精度的 12 位精度 JPEG 图像

理想情况下,图像应如下所示:

12 位精度 JPEG 图像编码为全 12 位精度

据我从 FJCore 实现中可以看出,图像精度记录在 JpegFrame 类中,但从未使用过。最初的 FJCore 实现似乎只完全支持 8 位精度的灰度图像。

我计划“不顾一切”并尝试自己扩展 FJCore 以支持灰度图像的 12 位精度。但在我这样做之前,我想我应该在 StackOverflow 中提出这个问题,看看有没有人遇到过并解决过这个问题?在这种情况下,我很高兴了解您是如何解决问题的。

提前谢谢了!
安德斯@Cureos

4

1 回答 1

2

我刚刚更新了我自己的 JPEG 解码器来处理扩展模式,而我需要改变的是我的逆 DCT。在更改代码之前,输出看起来与上面的示例图像相似。我一直从熵解码中存储 16 位系数值,但是我的 DCT 计算在进行数学运算时使用 16 位整数来保存临时值,从而破坏了较大的值。我将 DCT 代码更改为使用 32 位整数进行计算,从而解决了问题。

于 2012-01-05T17:20:38.270 回答