グレイスケール画像の解析

ここではグレイスケール画像をパーシステントホモロジーで解析します。 ここで解説する内容は以下の通りです。白黒画像との共通点は非常に多いです。

  1. 画像からパーシステント図を計算する
  2. その図を可視化する
  3. テキストデータにbirth-death pairを出力する
  4. 基本的な逆解析(birth pixle, death pixelの出力)を行う

ここでは入力データとしてはテキストデータを使いますが、 普通の画像でも基本は同じです。

テキストデータについて

ディレクトリには grayscale.txt というファイルがあります。数値が2次元に200x200で並んでいます。これを解析してみましょう。まずデータの中身を見てみます。最初の5行をheadコマンドで表示します。

パーシステント図を計算する前に、このデータを可視化しましょう。txt2png.pyというプログラムを用意しているので これを使ってテキストデータを画像に変換します。変換した画像はdisplayで表示します。

パーシステント図の計算

パーシステント図の計算は以下のようにします。 とします。grayscale.pdgmというファイルが生成されます。 これがパーシステント図の情報を収めたファイルです。

パーシステント図の可視化

次に計算結果の0次のパーシステント図、つまり連結成分、島構造、を可視化しましょう。 スーパーレベルを使っているので、値の高い部分、つまり白色のピークの構造などが捉えられます。

ラムのグリッドが細かすぎてちょっとわかりにくいようです(デフォルトは 128x128です)。グリッドを荒くしましょう。

この図ではbirth-death pairは図の右下のほうに来ています。 通常は birth < death なので左上のほうに現れるのですが、 スーパーレベルフィルトレーションを使うということは閾値を大きいほうから 小さいほうに下げていく過程での島の生成と消滅を見ているので birth のほうが閾値では大きくなるのです。

練習問題: birth-death pairは[0,1.5]x[0,1.5]のあたりに多く分布しているようです。 このあたりを拡大して表示しましょう。

テキストファイルへの出力

これはどの入力データでも同じです。

grayscale-superlevel-0.txtに保存されます。中身を表示しましょう。最初の10行だけ見てみます。

1列目がbirth time、2列目がdeath timeです。 このデータからも birth > death となっていることがわかります。

逆解析(birth pixel, death pixel)

対角線から離れた birth-death pairが重要な構造を表現しているわけなので、上で 見たパーシステント図から、death - birth < -0.3 となるような点の 由来を元データに戻って調べてみることにしましょう。下図の 丸を付けたものです。

逆解析の手法も基本的には白黒画像の場合と同じです。 HomCloudのbirth pixel、death pixel出力機能を使います。島(連結成分)が生まれた/死んだ ときのピクセルの位置を出力します。 まずはテキストで出力します。

1列目がbirth time、2列目death time、3列目がbirth pixel、4列目がdeath pixelです。 0次のパーシステントホモロジーの場合、birth pixelがその島のピーク位置になるので 重要です。つまり3列目ですね。これを可視化してみましょう。 このピクセルを入力画像の上に表示してみます。

オプションの意味等は二値画像の場合と同じです。ちょっと注意しておくと、ここでベースの画像 (grayscale.png)に最初にtxt2png.pyで作った画像を使っています。

この画像がgrayscale-birthpixels.pngに出力されます。 赤い丸がbirth pixelの位置です。

画像の特徴的な白のピーク位置が捉えられています。では一番のピークの 位置はどうなっているのでしょう?実はこれはdeath timeが-∞となるものと対応しています。 そしてdeath timeが-∞のものに関してはbirth/death pixelが出力されていないので こうなっています。

高度な逆解析

二値画像の場合にはpict.treeモジュールを使って高度な解析を行いました。グレイスケール画像の場合でも同様の解析を 行ってみましょう。

-m オプションや -T オプションの意味はこのグレイスケール画像のチュートリアルの最初に説明した pict.pixel_levelset_nd と同じです。

pict.show_volume_2d で可視化します。

赤い四角形が birth-pixel でその周辺の薄い赤い領域がその birth-death pair に対応する領域です。 このプログラムの引数は以下の通りです。

以上でこのチュートリアルは終わりです。