Swampdog part9 -OsiriXで個別に骨を抽出-
本プロジェクトの作業は、大まかに以下の2つに分けられます。
- OsiriXでCTデータから3Dモデルを取得する
- Unityでそれを閲覧するVRアプリを作る
part8まででふんわりとアプリの形が見えてきましたので、ここで一旦OsiriX側まで戻ります。
これまではざっくりと骨だけを抽出したものを対象にアプリを作っていました。
つまり、複数の骨が1つのオブジェクトとして固められていました。
よって、これから骨1つ1つを個別に抽出します。
犬の全身の骨の総数は約320個。
人力でいけない数ではありません。
今回は胸腹部に限定するので、
- 胸椎: 13個
- 肋骨: 13 * 2個
- 胸骨: 9個
の合計48個です。
また、筋肉、臓器、血管、神経なども順次取得していきます。
OsiriXについては日本語の情報が少ないので調べてわかったことは細かく残しておこうと思います。
(以前自分が書いた記事が検索上位に上がってくるほど)
- IMACEL ACADEMY: VR解剖アプリを作る その1 ~CTスキャンの結果から3Dデータを得る~
OsiriXとは
「OsiriXまとめ」として別記事にまとめました。
以下の記事を参照ください。
骨の切り出し
まず、今回対象にするDICOMファイルをOsiriXで確認して見ます。
仰向けの犬の断面図が連続的に再生されます。
0:11あたりから背側の中央部の白く丸い骨(胸椎)から、胸部を下から上に移動する白い楕円形の構造が見えます。
これが肋骨です。
頭部から後方に向かって斜めに生えているので同一スライス断面に表示されないのです。
以下の画像を見ながら立体構造を意識していると、だんだん断面図が何を示しているかわかると思います。
引用元: 子犬の部屋: 犬の解剖図
これは大まかに骨だけを3D表示したのですが、胸椎と肋骨が一体化してしまっています。
2Dで見てもこのような場所は境界が不明瞭です。
画面のコントラストを調整することでうまく判別しましょう。
ちなみにドラッグでコントラストを変えるのは、CT値と白黒の度合いを変えるだけ(表示を変えるだけ)なので、当然ですがCT値は変わりません。
胸骨同士は前後で穴と突起がうまくはまっています。そのため、OsiriX上ではかなり分離しづらいです。
ひとまず、肋骨から1本ずつROIを形成します。
単純にリージョングローイングで指定しただけだと、どうしても接している胸椎や胸椎伝いに繋がっている他の組織もROIに含まれてしまいました。
全身をシリーズに表示していると、後方で繋がっていて、胸部のROIに影響を与えてきます。
(後ろの方で繋がっているから同一のものと認識される。)
一旦胸部だけのシリーズを作り直します。
サブシリーズの抽出
上で少し触れましたが、DICOMファイル内の一連の画像のまとまりをシリーズと呼びます。
今回は全身のCTスキャン結果を用いるので、シリーズには頭から尾までの画像が含まれます。
しかし前述のように特定領域に関して作業を行いたい場合は邪魔になってきます。
そこで、必要な画像だけ取り出して、新しいシリーズを作って作業の効率化を図ります。
(多分、OBJファイルにした時に元のDICOMファイルにおける位置が記録されるはずだから、特に位置合わせをしなくても済むはず。無理だったら今後の作業量が莫大に増える)。)
トップ画面に戻り、optionボタンを押しながら「2Dビューア」をクリックすると表示する画像の範囲を選択できます。
その後、リージョングローイングで色々試してみましたがうまく設定できなかったのでマニュアルで骨を一つ一つ選択しました。鉛筆とリパルサーを使いました。
鉛筆で大まかに輪郭をなぞってからリパルサーで微修正するのがやりやすいです。それぞれ「R」、「D」がショートカットキーなので使うと良いです。
トラックパッドでやる作業じゃないですね。腱鞘炎なりそう。
ペンタブが欲しい。少なくとも今後はマウスを用意します。
サーフェスレンダリング
抽出したい部位を囲むROIを作成できたら、不要部分を除去します。
「ROI -> このシリーズ内のすべてのROIsを選択」
「ROI -> ピクセル値を設定」で、
まず「ピクセルの設定 -> ROIsの内側」として、「この表示値に設定 -> 十分に大きい値(2000とか)」にします。
次に「ピクセルの設定 -> ROIsの外側」として、「この表示値に設定 -> 十分に小さい値(-2000とか)」にします。
これでROIの内側だけが残りました。
最後に「3Dビューア -> サーフェスレンダリング」でROIの内側だけを3Dモデル化することできます。
こんな感じで肋骨を切り出すことができました。
骨頭の形がそれなりに見て取れます。
どうしてもガビガビになるところは仕方ないですね。
間引き回数と平滑化をマックスまで上げたら少しよくなりました。
それでもなぜかスリットが入ってしまいます。
ROIがうまく設定できていないのかな。
とりあえずOBJファイルとして保存します。
Unity上で確認
最後に、Unity上でこれまで使ってきた全身骨格と比較を行います。
同一のUnityプロジェクトに配置して、相対位置がずれていないかチェックします。
これがずれていたら(OBJファイルが位置を記憶していなかったら)大変に大変です。
バリー(初出ですが、検体の名前)の全身骨格OBJファイルと、今回作った肋骨のOBJファイルをUnityプロジェクトに放り込みます。
共に位置は原点にして、確認。。。
ちゃんと位置が記憶されています。
胸椎ともうまくはまっています。よかった。
これでジャンジャンバリバリ骨を切り出してUnityに放り込んでいけばいいことがわかりました。
懸案が一つ解消されてよかったです。
次回
以上、骨一本切り出すのにOsiriXの使い方を学びながらとはいえ、4時間ぐらいかかりました。
ひょえー。
次からはもっとサクサクできると思いますが、前途多難だなあ。
とりあえずこれを残り47本分やります。
やります。
参考
- embodi3D: How to Create 3D Printable Models from Medical Scans in 30 Minutes Using Free Software: Osirix, Blender, and Meshmixer
- ドッグシッターで ゆるめ屋です.。.:*☆: 犬の骨格(胸郭)
- SlideShare: OSIRIX