2

私のC#Silverlightアプリケーションでは、FJCoreクラスライブラリを使用して、圧縮されたJPEG転送構文でDICOM画像をデコードしようとしています。

DICOM画像は通常12ビットの精度で圧縮されます。元のFJCoreソースコードを使用してこのような画像をデコードしようとすると、「サポートされていないコーデックタイプ」という例外が発生します。これは、元のFJCore実装では、SOF0(ベースラインDCT)とSOF2(プログレッシブDCT)のフレーム開始マーカーのみであるためです。サポートされています。SOF1マーカー(Extended Sequential DCT)も受け入れ、SOF1フレームをSOF0フレームと同じように扱うように実装を変更すると、画像はデコードされますが、8ビットのみが考慮されます。

変更されたFJCoreライブラリを使用してデコードすると、一般的な12ビットの高精度画像は次のようになります。

FJCoreによって8ビット精度にエンコードされた12ビット精度のJPEG画像

理想的には、画像は次のようになります。

完全な12ビット精度にエンコードされた12ビット精度のJPEG画像

FJCoreの実装からわかる限り、画像の精度はJpegFrameクラスに記録されますが、使用されることはありません。元のFJCore実装は、8ビット精度のグレースケール画像のみを完全にサポートしているようです。

私は「雄牛を角で捕まえる」ことを計画しており、グレースケール画像の12ビット精度をサポートするためにFJCoreを自分で拡張しようとしています。しかし、その前に、StackOverflowで質問をして、誰かがこの問題に遭遇して解決したことがあるかどうかを確認する必要があると思いました。その場合、あなたがどのように問題を解決したかを知ってとてもうれしく思います。

よろしくお願いします!
アンダース@キュレオス

4

1 に答える 1

2

拡張モードを処理するために自分のJPEGデコーダーを更新したところ、変更する必要があるのは逆DCTでした。コードを変更する前の出力は、上記のサンプル画像のようになりました。私は常にエントロピーデコードから16ビットの係数値を保存していましたが、計算中に一時的な値を保持するために16ビットの整数を使用することにより、DCT計算で大きな値が破損していました。計算に32ビット整数を使用するようにDCTコードを変更したところ、問題は解決しました。

于 2012-01-05T17:20:38.270 に答える