しらとりのブログ

社会人ひよこプログラマのtil

DICOMでJPEGを扱うときの注意点

DICOMを知っている人向けです。 DICOMでは転送構文というものが定義されており、一般でいうところのエンコーディング規則に相当します。転送構文にはJPEGコーデック指すものが含まれていますが、その中には特殊な形式のJPEGが存在するので扱いには気を付けなければという備忘録です。

転送構文とコーデックの関係

DICOMでは公式に定義される転送構文(TransferSyntax:以下TS)からDICOMメッセージのデータセット部分のエンコーディング規則を決定します。TSの情報はDICOMメタ情報部分の(0002,0010)にセットされており、これは必ずImplicit VR Endianで読み取ります。

つまり、DICOMファイルからピクセルデータを抽出する場合、この転送構文をみてデコーダを変える処理が必要です。大体の場合ライブラリがサポートしてくれますが、基本的にこのメタ情報のTSからコーデックを判別するのでメタ情報の有無はチェックしたほうが良いでしょう。特にSTORAGE-SCPの実装時は受信したデータにメタ情報が入っていなかったりするので注意する必要があります。

DICOM通信における転送構文

DICOMでは35種類もの転送構文が定められています。よく使われるのは以下の転送構文です。

UID NAME 備考
1.2.840.10008.1.2 Implicit VR Endian RAWデータ
1.2.840.10008.1.2.4.50 JPEG Baseline 非可逆圧縮
1.2.840.10008.1.2.4.70 JPEG Lossless, Nonhierarchical, First- Order Prediction 可逆圧縮

アプリケーションエンティティ(以下AE)間の通信ではまず使用する転送構文を決定しなくてはなりません。
通信を開始するには
  1. 通信を開始する側(以下calling AE)がされる側(以下called AE)に対して自分が対応できる転送構文を1つ以上提示する。(A-ASSOSIATE-REQ)
  2. called AEは提示された転送構文の中から自分が対応できる転送構文を1つ選択し、レスポンスを返す。(A-ASSOSIATE-RES)
という手順が踏まれます。

さらに、この手順は下記のルールに従って行う必要があります。

  1. A-ASSOSIATE-REQの提示する転送構文には少なくともImplicit VR Endianが含まれていなければならない。
  2. (a)のルールに従ってA-ASSOCIATE-REQを受けたcalled AEは、このアソシエーションを拒否してはならない。

送り手も受け手もImplicit VR Endianをサポートすれば最悪それで通信出来るようにしてねという意味合いが込められています。 しかし、このルールには以下のような例外があります。

  • calling AEが送信する非可逆なコーデックのピクセルデータにアクセスできるが、それを読み取れるような転送構文をサポートしていない場合は(a),(b)ともに無視してよい
  • calling AEが送信する非可逆なコーデックのピクセルデータにアクセスできて且つ、それを読み取れる転送構文をサポートしている場合は(b)を無視してよい

分かりにくいですが、これをルールを踏まえて言い換えると、callingAEは無損失圧縮の画像をImplicit VR Endianで送れるようにRAWデータにしてから送ることができる必要があるが、calling AEが損失圧縮の画像しか持たない場合、提示する転送構文にImplicit VR Endianを含まなくても良い、ということになります。

規格上はcalled AEはLossyな画像の転送構文のみ提示されたアソシエーションを受けた場合は拒否しても良いということになりますが、ユースケースを考えると大体の場合called AE側で圧縮画像が送られてきた場合の対応することになるので、このあたりも注意が必要です。

JPEG Lossless, Nonhierarchical, First- Order Predictionは普通のJPEGではない

Implicit VR EndianとJPEG Baselineでの読み取りは問題ありません。(それぞれ生データと普通のJPEGファイル) 問題はLossless JPEG形式の転送構文で送られてきた場合です。
JPEG Lossless, Nonhierarchical, First- Order PredictionはISOで定められた規格ですが、医療画像以外の分野ではほぼ使用されていません。なので通常のJPEGコーデックでサポートされないことがほとんどです。多くの場合DICOMライブラリにデコーダが含まれています。このデコーダの有無は非常に大きいので、ライブラリの選定基準の一つになると思います。