日々鍛錬

日本で一番?わかり易い??システムの落書き帳???を目指し????,日々鍛錬中な元SEさん主婦によるデベロッパとユーザと自分のための雑記帳

3D slicerのVolume 画像重ねあわせ方

3D slicer の画像重ね合わせの方法について,記述しておく.
まずは,3D slicerの画面構成の画像を提示
 f:id:tomokop:20140201234059j:plain

説明は画像内でも行ってますので,省略します.
もし必要なら,別の機会にでもキレイに記述する予定(あくまで未定ということ)

1. 重ねあわせたいVolumeの読み込み
読み込むためのVolumeを上の画像内のTool bar内Dataアイコンをクリックする.
読み込みたいファイルを選択すると以下の画像の通りになります.
複数選択も可能なので,試してみてください.
f:id:tomokop:20140201234502j:plain

私は今回,Slicerの公式サイトのTutrialのデータとして配布されているデータを用いました

  • spgr.nhdr : 人体の脳部医用画像(おそらく,MRI画像?)
  • all.nhdr*1:上記の画像から,各組織へ分けたRegionのラベル統合画像(多分)

2.上記の処理終了後,以下の画像が提示されます.
私の画面では,

  • モジュールが「volume」で提示されていることに注意.
  • 読み込まれたデータのうち,「all」というデータで提示されていることに注意.

f:id:tomokop:20140202001126j:plain

3. 3D Viewer上に画像を表示します.
2D anatomical Viewer上でどれでも良いので,各画面内の一番左端の「押しピン」ぽいアイコンをクリックすると以下の画像が出現します.
f:id:tomokop:20140202001519j:plain

Defaultは2つのリングが外れている状態ですので,このリングのアイコンをクリックし,リングをくっつけて下さい.
そうすると,3枚の画像間で連結でき,3D Viewer上で,3つの画像を同時に出力することができます.
リングの隣のつぶらな瞳をクリックすると,3D viewer上に3枚のスライス画像を出力することができます.
このつぶらな瞳こそ,3D viewer上に画像を表示するかどうかのボタンとなるわけです.

瞳の隣は,この画面上で表示したい平面を選択できます.
一番右端のリストは読み込んだデータのうち,提示したいデータを提示するものとなります.

4. では,3D Viewerを見ましょう
この3D Viewer上で左マウスでグリグリすると回転,右マウスでグリグリすると拡大縮小します.
f:id:tomokop:20140201234636j:plain

3D Viewerの一番左端にある,押しピンぽいアイコンをクリックすると,以下の画像が出現

*1:nhdr formatについて,すみません...わかりません.情報いただけると嬉しいです

続きを読む

3D slicer

3D slicerとは,ハーバード大学医学部の関連病院の一つ,Brigham And Women's HospitalのSurgical Planning Lab. で主に開発されている,医用画像の可視化,解析用のオープンソースソフトウェアのことである.
3D slicerの嬉しいところは,以下の部分も非常に大きい.

  • マルチプラットフォーム
  • オープンソースによる開発
    • 何と言っても無料
    • 世界チュの研究者,開発者による開発が行われている!(プロの意見がもらえる!)
    • インストール時から充実した機能(自分の考える理論の段取りを確認できた!)
  • 必要に応じたPluginの開発,追加が容易
    • ITKライブラリ(画像処理),VTKライブラリ(画像可視化)のPluginが導入
    • Python, Tcl/Tkでも開発可能なので,codeを書いての実験が容易!(嬉涙目)
    • Open IGTによる,デバイス間との通信も可能らしい(これは理解不足です)

とにかく,画像解析結果を確認するときには多いに私は利用しているのであります.

また,このシステムは医用画像に特化しているというわけではないらしく,様々なモデルや画像に対しても対応出来るのがまた嬉しいところと思います.
友人の一人はこのシステムを用いて,車部品のモデル(stl形式)で色々遊んでいたのを見て,「すごー!!」としか,言葉が出ませんでした...

2014年2月1日現在のStable VersionはVer.4.3.1のようです.
公式サイトはこちらです.
3D slicer : http://www.slicer.org/

もう少し詳しく勉強して,現在研究中のシステムに統合出来るといいなぁ...

参照サイト:

医用画像工学

まずは医用画像工学の説明を簡単に
#ここで,コメントを頂けますと嬉しいです.

医用画像工学

  • 医学(免疫,病理学,解剖,臨床など)
    • 生体系の構造,組織,機能について考察,解析,理解すること
    • 上記の知識を基に,生体機能の正常かを目指した応用技術
  • 画像工学
    • 得られた情報を視覚的に理解,解析,考察,改善すること
    • 上記を基に,目的技術への展開,サポートを応用とする技術

まとめると,私は以下の様に定義している.

医学知識と工学知識の融合による,より正確な医療研究,臨床を目指した技術とその応用

医用画像工学は,大きく以下の分野へ分けられると考える.

  • 医用画像画質改善:医用画像内のアーチファクトやノイズ等の影響除去
  • 医用画像解析:得られた医用画像から,臨床に必要な情報の抽出,解析を行うこと
  • 医用画像ソリューション:実際に臨床に必要な情報を加工し,サポートするシステムの構築,提案

ひとまず,私の専門は3番目ということになるのです.

f(x, θ)の表記方法の意味

本日,論文に載っていた式.

 f(x; \theta)

xを変数,\thetaをパラメータとして考える
例えば,尤度関数になると,

 f(x;\theta) =L(x, \theta) = L(x|\theta) = f_{\theta}(x)

これが,任意の変数で表現すると,

 f(x_1, x_2, \cdots;\theta) =L(x_1, x_2, \cdots ;\theta) = L(x_1, x_2, \cdots|\theta)

また,平均値 \mu ,標準偏差 \sigmaとした時,尤度関数,Gaussianで表現する.

 f(x;\mu,\sigma)=\(1/\sqrt 2\pi \sigma \) \cdot \exp\({-(y-\mu)}^2 / \(2 {\sigma}^2 \) \)

理解した.

Cannot find or open the PDB file に悩まされる.

正直,この記事を書いてる時もよくわかってません.
そもそもPDB fileとは??と考えますが,よくわかりません.
ただし,以下のメッセージ,

Cannot find or open the PDB file

あまりに気持ち悪い気がしますので,その解決を行う.

Visual studioのプロジェクトの設定において,

  1. デバッグ」から「プロジェクトと設定」(オプションのこと)を開く
  2. 「全般」から「シンボル」を選択
  3. 「Microsoft シンボルサーバ」のチェックを入れる

以上で,シンボルが読み込まれます.
色々調べて見たところ,どうやらDebug用の読み出しファイルであるらしい.
おまけに,このエラーは無視して良いとのことです.

デバッグなら有効にしたほうが良いかもしれないけど,「デバッグなしで実行」で基本問題なし.

一番,情報として理解したサイトを提示
Cannot find or open the PDB file in Visual Studio C++ 2010 - Stack Overflow

Cannot find or open the PDB file in Visual Studio C++ 2010

I use Visual Studio 2010 C++ and my project builds without errors but when I run it I get this. I am on Windows XP.
'Shaders.exe': Loaded 'C:\Documents and Settings\User\My Documents\Visual Studio 2010\Projects\Shaders\Win32\Debug\Shaders.exe', Symbols loaded.
'Shaders.exe': Loaded 'C:\WINDOWS\system32\ntdll.dll', Cannot find or open the PDB file
'Shaders.exe': Loaded 'C:\WINDOWS\system32\kernel32.dll', Cannot find or open the PDB file
・・・・

Answer:
PDB is a debug information file used by Visual Studio. These are system DLLs, which you don't have debug symbols for. Go to Tools->Options->Debugging->Symbols and select checkbox "Microsoft Symbol Servers", Visual Studio will download PDBs automatically. Or you may just ignore these warnings if you don't need to see correct call stack in these modules.

何かしら,いるんだろうとは思うけど,今のところいらないので,この指示に従っておく.
理解り次第,色々掲載を行う.

VTKの各ディレクトリの関係について理解する.

VTKが無事インストールされたなら,VTKのSourceとVTKをBuild*1したディレクトリの2つが出来上がるはず.
今回はこの中身について考えてみる

Source以下にある,Exampleというディレクトリの構成*2を示す.

├─Examples
│ ├─AMR
│ │ └─Cxx
│ ├─Annotation
│ │ ├─Cxx
│ │ │ └─LabeledMesh
│ │ ├─Python
│ │ └─Tcl
│ ├─Array
│ │ └─Cxx
│ ├─Build
│ │ ├─vtkLocal
│ │ │ └─Testing
│ │ │ └─Cxx
│ │ └─vtkMy
│ │ ├─Common
│ │ ├─Examples
│ │ │ ├─Cxx
│ │ │ │ ├─Ex1
│ │ │ │ └─Ex2
│ │ │ └─Tcl
│ │ ├─Imaging
│ │ ├─Unsorted
│ │ ├─Utilities
│ │ │ └─Doxygen
│ │ └─Wrapping
│ │ └─Tcl
│ │ ├─vtkmy
│ │ ├─vtkmycommon
│ │ ├─vtkmyimaging
│ │ └─vtkmyunsorted
│ ├─Charts
│ │ └─Cxx
│ ├─DataManipulation
│ │ ├─Cxx
│ │ ├─Python
│ │ └─Tcl
│ ├─Graphics
│ │ └─Python
│ ├─GUI
│ │ ├─Cocoa
│ │ │ ├─Documentation
│ │ │ └─SimpleCocoaVTK.xcodeproj
│ │ ├─Motif
│ │ ├─Python
│ │ ├─Qt
│ │ │ ├─Events
│ │ │ ├─FourPaneViewer
│ │ │ ├─GraphicsView
│ │ │ ├─GraphicsViewPython
│ │ │ ├─ImageViewer
│ │ │ └─SimpleView
│ │ │ └─Icons
│ │ ├─Tcl
│ │ └─Win32
│ │ ├─SampleMFC
│ │ │ └─res
│ │ ├─SimpleCxx
│ │ ├─vtkBorland
│ │ │ ├─Package
│ │ │ └─ProjectDemo
│ │ └─vtkMFC
│ │ ├─vtkDLG
│ │ │ └─res
│ │ ├─vtkMDI
│ │ │ └─res
│ │ └─vtkSDI
│ │ └─res
│ ├─Hybrid
│ │ ├─Cxx
│ │ └─Python
│ ├─ImageProcessing
│ │ ├─Cxx
│ │ ├─Python
│ │ └─Tcl
│ ├─Infovis
│ │ ├─Cxx
│ │ │ ├─ChartView
│ │ │ │ └─Icons
│ │ │ ├─CustomLinkView
│ │ │ │ └─Icons
│ │ │ ├─EasyView
│ │ │ │ └─Icons
│ │ │ └─StatsView
│ │ │ └─Icons
│ │ ├─Java
│ │ ├─Python
│ │ └─Tcl
│ ├─IO
│ │ ├─Cxx
│ │ ├─Python
│ │ └─Tcl
│ ├─MangledMesa
│ │ └─Tcl
│ ├─Medical
│ │ ├─Cxx
│ │ ├─Python
│ │ └─Tcl
│ ├─Modelling
│ │ ├─Cxx
│ │ ├─Python
│ │ └─Tcl
│ ├─MultiBlock
│ │ └─Cxx
│ ├─ParallelProcessing
│ │ ├─Generic
│ │ │ └─Cxx
│ │ └─MPI
│ │ ├─Python
│ │ └─Tcl
│ ├─Rendering
│ │ ├─Cxx
│ │ ├─Python
│ │ └─Tcl
│ ├─Tutorial
│ │ ├─Step1
│ │ │ ├─Cxx
│ │ │ ├─Java
│ │ │ ├─Python
│ │ │ └─Tcl
│ │ ├─Step2
│ │ │ ├─Cxx
│ │ │ ├─Java
│ │ │ ├─Python
│ │ │ └─Tcl
│ │ ├─Step3
│ │ │ ├─Cxx
│ │ │ ├─Java
│ │ │ ├─Python
│ │ │ └─Tcl
│ │ ├─Step4
│ │ │ ├─Cxx
│ │ │ ├─Java
│ │ │ ├─Python
│ │ │ └─Tcl
│ │ ├─Step5
│ │ │ ├─Cxx
│ │ │ ├─Java
│ │ │ ├─Python
│ │ │ └─Tcl
│ │ └─Step6
│ │ ├─Cxx
│ │ ├─Python
│ │ └─Tcl
│ ├─VisualizationAlgorithms
│ │ ├─Cxx
│ │ ├─Python
│ │ └─Tcl
│ ├─VolumeRendering
│ │ ├─Cxx
│ │ ├─Python
│ │ └─Tcl
│ └─Widgets
│ └─Cxx

この例からも確認出来るように,VTKにはたくさんのサンプルコードを持っており.
基本はこのサンプルコードをどのようにいじっていくのかがポイントとなる.
また,上記からも確認できるよう,cxxだけでなく,Java, Python, Tcl についても揃っているので,試して行きたい.

また,導入として,上記のExample 以下にある,Tutorialのディレクトリを見てみると,最初のステップのレクチャからプリミティブ形状(Cone)を用いて,
VTKによるレンダリングから少々難しいインタラクションまでのコードを取り揃えている.
VTKによる勉強を始める前に,まずこれを最初は見ていくようにしたい.

│ ├─Tutorial 
│ │ ├─Step1  Hello World のように,簡単にVTK内のコード利用についての説明 (レンダリングとアニメーション)
│ │ │ ├─Cxx
│ │ │ ├─Java
│ │ │ ├─Python
│ │ │ └─Tcl
│ │ ├─Step2  Step 1 にTime call back関数をいれこんで,もう少しテクニカルにしたコードの内容を紹介
│ │ │ ├─Cxx
│ │ │ ├─Java
│ │ │ ├─Python
│ │ │ └─Tcl
│ │ ├─Step3  Step 2のコードに複数のプリミティブな情報を入れた場合におけるコードの内容を紹介 
│ │ │ ├─Cxx
│ │ │ ├─Java
│ │ │ ├─Python
│ │ │ └─Tcl
│ │ ├─Step4  プリミティブに対して,各プロパティの情報を変更する場合におけるコードの紹介
│ │ │ ├─Cxx
│ │ │ ├─Java
│ │ │ ├─Python
│ │ │ └─Tcl
│ │ ├─Step5  任意のインタラクションを行った場合におけるコードの紹介
│ │ │ ├─Cxx
│ │ │ ├─Java
│ │ │ ├─Python
│ │ │ └─Tcl
│ │ └─Step6  3次元空間上におけるインタラクションコードを紹介
│ │ ├─Cxx
│ │ ├─Python
│ │ └─Tcl

このように,たくさんのコードが用意されているらしいのでサンプルコードから手をつけていくといいかもしれません.
特にTutorialには,各項目において,どのような手順に従って処理を施すかが記述されている.
しっかりと理解して進むようにしたい.

*1:こちらについては,以前掲載している記事を参照に

*2:スペースの関係上,CMake関連のディレクトリは除外

 VTKのExample source

VTK 自体は本当に多くの例題コードが掲載されており,勉強はこのSample codeから読む様にする.

VTKの基本のコード(5.10)の手順は以下のとおりである(Tutorial Step1 に従う).

  1. reader = (vtk上で取り扱うデータ形式)Reader()
    1. ここは形式に従って,Readerで読み込み,セットする
  2. mapper = (vtk上で取り扱うデータ形式)Mapper(reader)
    1. mapper->setInputConnection (reader->GetOutputPort() )
  3. actor = vtkActor()
    1. actor->SetMapper(mapper)
  4. render = vtkRenderer()
    1. render->AddActor( actor )
    2. render->SetBackground(R, G, B)
  5. renderWindow = RendererWindow()
    1. renderWindow->AddRenderer(render)
    2. renderWindow->SetSize( W, H)

これが,VTKの基本的な記述方法である.