DICOM XAという深遠にして難解なる世界への手がかり

DICOM-XAという動画フォーマットは、医療画像診断分野において1997年頃より全世界の医療現場・研究において用いられてきたものです。このDICOMフォーマットの制定により、全世界で統一されたフォーマットで画像情報を正確に伝達・保存が可能となったのです。しかしながら、その動画フォーマットであるDICOM-XAというものは、難解なデータ構造を持っています。

齋藤 滋は、2010年頃に、C/C++プログラミングの勉強のために自身でその動画再生プログラムを作成することを決意しました。しかし、それは困難と苦痛に満ちた試みでした。DICOM-XAは静止画のフォーマットである JPEGに基づいています。そして JPEGというフォーマットの根源にあるのは、ハフマン符号化というデータ欠損の無い圧縮です。なぜ、DICOM-XAが難解であるか? と問われれば、その多くは、肝腎のHuffmannフォーマットに関する明確な記述が JPEG仕様書にしか存在しないからであり、その JPEG独特の符号化をプログラミング言語で記載したものの解説は世の中にほとんど存在しないからでした。このような荒波の中、DICOM-XAの解読プログラム(=動画再生プログラム)を自分自身でフル・スクラッチで書くことに私は挑戦しまた。ここに、この齋藤 滋自身が歩んできた困難に満ちた長い戦いの記録を残します。

DICOM XAという深遠なる世界への困難に満ちた船出

2012年8月5日

皆様方は DICOM XAとうものをご存じでしょうか? 名前を聞いたことの無い方でも、もしも心臓カテーテル室関連で働いておられる方々は日々DICOM XAに関わっておられます。僕が初めてDICOM XAを知ったのは、1995年の頃だと思います。1988年末に開院した湘南鎌倉総合病院 心臓センター循環器科ではそれまで Philips DCIというマシンを心臓カテーテル検査に使用していました。このマシンは、内部的には Image Intensifierから得られたアナログ画像信号をデジタル化し、デジタル画像処理した絵をほぼ Real Timeで表示していました。マシン・ラックには巨大な Winchester Hard Diskが何台も連なっていた記憶があります。しかし、当時のことですから(何しろ CDだって無かった頃です)、画像の永続記録には、昔ながらの 35mm Cine Filmを使用していたした。昔懐かしい時代ですねえ。現在インターベンションを行っておられる若い先生方は見たことも無いでしょうねえ

「このDICOM XA解析」では、これまで自分自身のブログで公開してきた自分自身の理解の歩みを改めて Home Pageとして公開することにしました。これによって皆様方の DICOM XAに対する理解が深まることを期待しています。もっとも、例の 2012年6月に発生した FirstServeでの信じられないようなサーバー事故というか犯罪により、僕のブログも消失してしまいましたので、それ以前の記録はありませんが・・・・

昔話のついでですが、Philips DCIの次の世代のマシンは、Philips Integis H-3000とかいう名前のマシンでした このマシンが導入されたのが、1994年頃だと思います。このマシンになり永続的画像記録媒体として CDが初めて使用されたのです。しかしながら当時の CPU性能は低く、DICOM XAで記録したとしてもユーザーは動画として再生できませんでしたので、CD上にはDICOM XAと同時にMPEGか何かで動画を不可逆性に圧縮した動画も同時に書き込んであり、それを CD playerのようなもので再生していました。しかし、私たちはそこに DICOM XAという可逆性圧縮された標準規格の画像が記録されていることを知りませんでした。

そんなある時、かねてより知り合いだった NIR stent開発者であるMedinol社のCorbee博士がひょこんと鎌倉を訪ねてきました そうですね、もう 1999年ぐらいになっていたでしょう。訪ねてきた部屋は鎌倉サティアンSATIANとも呼ばれていた旧湘南鎌倉総合病院裏の駐車場脇に建てられていた医局や事務部門が入っていた建設工事現場用プレハブ(バラック)の一角にあった僕の根城、表向き「心臓センター研究室」Research_Centerと称されていた部屋だったからです。NIRステントのライセンスは当時既に Boston Scientific社に移っていたと思います。そして彼は、ラップトップ・コンピューターを取り出し、DICOM XA CDを動画再生して見せたのです。これが僕にとって、DICOM XAとうものの存在を知らしめ、しかもその時 優れたコンピューター・プログラムを書けば、当時の8086系32-bits CPUでリアルタイムに動画再生できるのだ、ということを知ったのです。そして、その時から何時か自分でも DICOM XAを再生するプログラムを書きたい、そのように思うようになったのです。

苦難の道

しかし、DICOM XA再生プログラムを書くためには苦難の道を辿る必要がありました。

僕自身がコンピューター・プログラミングの道に踏み入れたのは、未だパソコンという概念が無く、20CM四方ぐらいの基板の上に CPU, Controller LSI, Clock発信器, 0から9そしてAからFまでのキーと、入力Returnキーなどからなるキーボード、 4桁のLED displayそれに1KB程度のMonitor programが書かれたROM、そしてせいぜい2KB程度のRAMが搭載された Training Kitという One-board CPU Kitというものしかありませんでした。その当時はやりの CPUは Intel 8080/8085と Zilog Z-80でした。僕は Sharpの Z-80 Training Kitというものでハンド・アセンブル (アセンブラ言語でノートにプログラムを書き、それを命令表を見ながらノート上で、16進数字に手で書き換えること)で変換した16進数字列をキーボードから打ち込み、それを走らせて LEDを点滅したりして喜んで遊んでいました。これは1978年の頃ですが、当時のコンピューター言語としては、我々が使えるものは機械語(Machine Language)あるいは、それに衣を被せたアセンブラ言語(Assembler Language)ぐらいしか存在しなかったのです。また、世の中でも大型コンピューターの上ですら、FORTRANや COBOL程度の言語しか走っておらず、ようやく PASCALや Cといった構造化言語のプロトタイプがつくられ始めた頃です。

DICOM XA Viewer作成のために、まず自分に必要なスキルは、ビット演算やポインタ演算可能なアセンブラ言語に近い高級言語であるC言語を習得することとでした。そして、1999年頃になって、C言語にオブジェクト指向の考え方を取り入れた C++言語が急速に普及してきたのです。Windowsも Windows95が 1994年に発表されると、その上で走る統合化開発環境(IDE: Integrated Development Environment)である、Visual Studioというものが Microsoftより発表されました。この開発環境の下で、C/C++, BASICなどを用いてプログラムを皆が書けるようになったのです。もっとも、C/C++という純粋な言語のみを用いていては Windowsの下で走るグラフィック満載の GUI(Graphical User Interface)搭載プログラムを書くことはなかなか困難です。Microsoftはこの要求に対して、MFC(Microsoft Foundation Class)というクラス・ライブラリを公表し、これに基づけば比較的簡単に GUI搭載プログラムを書けるようになりました。しかし、MFCを使いこなすためには、C++言語の知識と MFC独特の世界に対する慣れが必要です。ここらも自分一人周りに誰一人教えて下さる仲間がいない中で、多数の書籍を読み、インターネットで調べ、あるいは時にはインターネット掲示板に疑問を投げかけたりしながら、ゆっくりと前に進んでいく必要があったのです。もちろん、これは挫折の歴史でした。何か月も全く前に進めない時も何回もありました。

このように苦労しながら、ある程度基本的スキル(C/C++言語習得と MFC classの使い方習得など)を身に着けてからいよいよ DICOM XAの深遠なる世界への旅に船出したのです。それは 2004年頃のことでした。

規格書は公開されているのに

C++である程度プログラムを書けるようになっても、道はまだまだ遠いのです。DICOMの規格書は公開されています。誰でもインターネットで無料で手に入れることができるのです。そこに書いてあるようにすれば誰でもDICOMを使いこなすことができるのです。しかし、世の中そんなに簡単ではありません。まずこのDICOM規格書は、文章として膨大です。しかも英語なのです。一部については日本語翻訳も存在しますが、大部分は英語なのです。巨大な文書であり、素人が一人で入っていくには、広すぎます。何から手を付ければいいか全く判らないのです。なぜならばDICOMというのは実世界を医療のデジタルデータとしてmappingするための巨大な定義書だからなのです。

DICOM XAというものが、この膨大なDICOMの中のほんの一部分であり、主としてlosslessで動画を記録するための、ほんの一部分の規格であることを知ったのは DICOM規格書の世界に踏み入って何年もしてからなのです。

次に僕が知ったのは、DICOM XAで用いられている画像圧縮はJPEGを用いている、ということでした。JPEGに関しても1992年に規格書が公表され、インターネット上で誰でも入手することができます。これも英語で書かれておりますが、DICOM規格書よりも量は少なく、頑張られば読み通すことができます。しかし、やはり難解なものであり、素人が自分一人で理解するのは困難でしょう。僕も何回読んだか分かりません。そうこうしている内に、DICOM XAで用いられているのは、JPEGの中の一部分、具体的に言えば JPEG Losslessという圧縮方法であり、JPEG不可逆圧縮で用いられるAC成分の離散コサイン変換というややこしいことは用いず、DC部分の圧縮に用いられる可逆圧縮であるハフマン符号圧縮が用いられている、ということでした。ここまで一人で理解するのには数年間必要でした。

ここまでくれば目標は見えてきます。要するにDICOM XA Viewerを作成するためには、JPEG Lossless圧縮のDecodingを行えば良い、ということになります。従って、Huffman Codingの Decoding programを作成すれば良い、ということになります。なあーんだ簡単だー、と思うでしょうか?

実はここからが難しいのです。JPEG Huffman Codingは非常に難解なのです。Huffman符号化というのは、いわゆるアルゴリズムの本には必ず書かれているほど有名なアルゴリズムです。しかし、JPEGで用いられているハフマン符号化というのは、これらと全く異なるのです。

僕はここまで理解するのに、それこそ10年間必要でした。その間、既にViewerを開発されている企業の方々にも質問をしました。しかし、その全員が、皆肝腎の部分に関しては口を閉ざされるのです。それには二つの理由があるでしょう。一つは、彼ら自身、肝腎の部分に関しては全く理解していない。肝腎のDecoding programについては、コンポーネントを購入している、そんな場合も多くあるでしょう。あるいは、彼ら自身で開発し、理解しているが、貴重な知的財産であるので、非公開としている。このような理由でしょう。それはそれで理解できます。しかし、しかしです、これまでも述べたように、DICOMも JPEGもその規格はインターネットにも公開されている人類全体の貴重な知的財産なのです。ですから、本来は誰しもその規格に則ってプログラムを書けるようになるべきです。

長くなりましたが、以上の理由で僕は僕が理解し、到達したことをここに公開することに決めました。皆様方のDICOM XAのための理解の一助となれれば本望です。なお、このように自分が理解するためには、多くの人々の助けがありました。特に、石立先生のホームページは非圧縮の DICOM Viewer作成手順を全て公開され、非常に助けになりました (残念ながら現在は、DICOM画像表示プログラムはメニューから削除されているようです)。また、DIBに関する色々なホームページも参考にさせて頂きました。Huffman符号解読に際しては、高村先生に大変お世話になりました。多くのバグをご指摘頂き、感謝しております。また、石橋先生、徳永先生にもご指導頂き、感謝しております。ここにお礼を表したいと思います。