背景
近年では3次元画像の取得が容易になっている一方で、3次元画像に用いる画像処理ライブラリは充実していない。
今回は3次元画像に対して分水嶺 (Watershed) と呼ばれる領域分割手法を行いたかったため探したところ、画像処理ソフトウェアFiji (Fiji is just imageJ) のプラグインに3Dモルフォロジ演算を行う関数が実装されていたので試してみた。
以下からは、導入方法および関数の使い方についてまとめた。
環境
- Mac OS X 10.10.5 (Yosemite)
- ImageJ version : 2.0.0-rc-14/1.49g (http://imagej.net/Contributors)
プラグイン導入
https://github.com/ijpb/MorphoLibJ/releases から、MorphoLibJ 1.3.1.jar をダウンロードする。
GUIで導入する場合は、Fijiを開いてダウンロードしたファイルをドラッグ&ドロップする。
ターミナルから導入する場合は、/Applications/Fiji.app/plugins/ の下に MorphoLibJ_-1.3.1.jar を置けばよい。
本プラグインのドキュメントは以下を参照。
http://imagej.net/MorphoLibJ#Watershed_segmentation
関数
まず関数の使用例として用いる、以下のような画像をpython上で作成した。
import numpy as np
import skimage.io as skimage
img = np.zeros((100, 100, 100))
for i in range(100):
for j in range(100):
for k in range(100):
if (i - 40)**2 + (j - 40)**2 + (k - 40)**2 < 400:
img[i][j][k] = 255
if (i - 60)**2 + (j - 60)**2 + (k - 60)**2 < 900:
img[i][j][k] = 255
skimage.imsave('example.tif', img.astype(uint8))
ここからは、この画像を用いた関数使用例についてまとめる。また、visualize は Plugin の 3D Viewer を使用している。
Distance Tranceform Watershed 3D
Plugin > MorphoLibJ > Binary Images > Distance Transform Watershed 3D
- Options
- Distance
: ユークリッド距離変換を計算する重みを指定する。出力結果の境界面などに影響するパラメータ。 - Output Type
: 距離計算を行う際に、16bit(short)か32bit(float)を使用するか決めるオプション。 - Normalize weights
: distance mapを正規化するかのflag。 - Dynamic
: 値を大きくするとより多くのオブジェクトがmergeされ、小さくするとより多くのオブジェクトに分割されるパラメータ。 - Connecivity
: 注目voxelにおける計算領域を6近傍にするか26近傍にするか決めるオプション。
今回は上図で示したオプション指定で実行した結果を以下に示す。
画像の値はオブジェクトごとにラベリングされている。しかし、この状態だとvisualizeしても差がわかりにくいため、次にカラーラベリングを行う関数について述べる。
Labels to RGB
Plugin > MorphoLibJ > Label images > Labels to RGB
- Options
- Colormap
ラベリングするカラーマップの選択。 - background
オブジェクト以外のカラー選択。 - Shuffle
カラーマップの色選択をランダムにするかのflag。
個人的にcolormapに黄金角が用意されているのがGood。
上図で示したオプション指定で実行した結果を以下に示す。
本来二つのオブジェクトがmergeしてしまった場合に、watershedによって領域分割が行われてることがわかる。
考察
以上で分割されたオブジェクトがどの程度妥当なのか定量的に検証してみた。
オブジェクト | 体積 [voxel] | 元の体積 [voxel] | 割合 [%] |
---|---|---|---|
緑 | 31922 | 33493 | 95.31 |
青 | 104973 | 113040 | 92.86 |
このとき元の体積とは、画像を作成した際に決めた半径から体積を計算した値を表している。
また、割合は$\frac{体積}{元の体積} \times 100$から求めた。
この結果から、どちらかのオブジェクトに大きく偏って分割されていないことがわかる。
Distance Transform Watershed 3D において Distance が最も分割精度に影響するパラメータであるが、このパラメータを最適化する際の指標のひとつとして、ここで求めた割合を用いると良いかもしれない。