前回(第一回)ではITKを使った肺のセグメンテーションの概要について説明しました。まず肺のセグメンテーション概要のおさらいです。
(1)胸部CT画像入力 → (2)K-means法で人体組織とそうでない部分を分ける → (3)人体組織でない部分(外側)をリージョングローイング法で抽出する → (4)肺野内の空気領域を得る → (5)クロージングで肺内部の空洞を埋める → (6)セグメンテーション完了
繰り返しになりますが、肺のセグメンテーション手法はこれに限りません。あくまでも一例であることはお忘れなく。
今回は、「(2)K-means法で人体組織とそうでない部分を分ける」処理について説明したいと思います。「K-means法で人体組織とそうでない部分を分ける」とありますが、やることは実に単純です。具体的に以下の2ステップを行えば、「人体組織」と「そうでない部分(人体組織ではない部分)」を分けることができます。
①K-means法によって、入力画像の各画素値が「人体組織」と「人体組織ではない部分」かどうかが決まるしきい値を求める。
②求められたしきい値で二値化する。
では、詳しく説明していきましょう。
目次
K-means法は、データをK個のクラスタに分類する方法です。
難しく考える場合、以下の最小化問題[1]となります。
$$ J=\sum_{n=1}^{N}\sum_{k=1}^{K}r_{nk}||\bf{x}_\it{n}-\bf{\mu}_\it{k}||^\rm{2} $$ $$ r_{nk} = \begin{cases} 1\ \ \ \ k=argmin_j||\bf{x}_\it{n}-\bf{\mu}_\it{k}||^\rm{2}\\ 0\ \ \ \ それ以外 \end{cases} $$ここで、 \(\bf{x}_\it{n}\)は各データ、\(N\)はデータ総数、\(\bf{\mu}_\it{k}\)はクラスタの中心(平均値)を表します。二値指示変数\(r_{nk}\)も上記のように固定します。この上で、目的関数Jを最小化する\(\bf{\mu}_\it{k}\)を求めます。
ここでは、「人体組織」と「人体組織ではない部分」のクラスタに分けたいので、クラスタの数は2、データ集合は入力画像の全画素となります。(なのでデータ数は全画素数となります。)CT画像の1枚のスライスが\(512[\rm{pixel}]\times512[\rm{pixel}]\)であり、40スライスならば、
$$ N=512\times512\times40=10485760 $$
となります。
では、実際の計算はどのように行うのでしょうか。
クラスタ数が2であれば、「各データ点を最も近いクラスター中心に割り当てることは、各データ集合を二つのクラスター中心点の垂直二等分線で分割する判別と同等である。」[1]となります。下の図が手描きのイメージです。
つまり、以下のアルゴリズムで「人体組織」と「人体組織ではない部分」を分類するしきい値Tを求めます。長々と書いてきましたが、今回の記事の結論はこのアルゴリズムなのです。
このアルゴリズムに関しては、C++であればwhile文を使えば簡単に実装できるはずですので、今回はITKの説明はありません。
決定したTを用いて、入力画像を二値化します。以下の画像が得られた二値化画像です。
今回は肺のセグメンテーションにおける、「K-means法で人体組織とそうでない部分を分ける」処理について説明しました。以下の二点が重要です。
・入力画像の各画素を「人体組織」クラスタと「人体組織ではない」クラスタに分類するしきい値を求める。
・各クラスタの平均値が変動しなくなるまで分類を行うことによって、最終的なしきい値を求めることができる。
次回は、「(3)人体組織でない部分(外側)をリージョングローイング法で抽出する」の処理について説明します。いよいよITKが登場します。
バックナンバー:第一回
[1]C.M.ビショップ, パターン認識と機械学習、丸善出版, 2012.