白黒画像の解析

ここでは白黒の画像をパーシステントホモロジーで解析します。 ここで解説する内容は以下の通りです。

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

基本的にやっていることは、与えられた白黒画像の黒い領域を 膨らませたり萎ませたりして島や穴の生成と消滅を調べています。 https://arxiv.org/abs/1706.10082 の論文の2.3節、特にFig.2が参考になるでしょう。

パーシステント図の計算

同じディレクトリには binary-image.png というファイルがあります。以下のような画像です。 これを解析してみましょう。

まず最初に、

とします。すると binary-image.pdgm というファイルが生成されます。これが パーシステント図の情報を収めたファイルです。

という意味です。

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

次に計算結果の0次のパーシステント図、つまり連結成分、島構造、を可視化しましょう。 上の計算で-m black-baseと指定したので黒の島構造に注目します。 ポイントクラウドの場合と同様、plot_PDを使います。 -d 0で0次であることを、-lでヒストグラムの色付けを log scaleにすることを指定します。 -o binary-image-pd0.pngで出力ファイル名を指定します。

何か小さい点が図の上にぽうぽつと現れます。実はbirth time、death timeは この画像解析ルールだと整数の値しかとりません。デフォルトのヒストグラムは 128x128で計算しますから、これは細かすぎるのです。またこの図からすべての birth time, death timeは-20〜+7 くらいの範囲にあることがわかりますので、 これらをうまく表示されるようにプロットの領域や解像度を調整します。 -x "[-20.5:7.5]"でプロットする範囲を -20.5 から 7.5 に、 ヒストグラムの分割を28x28に指定します。birth time、death timeは整数値なので、 ヒストグラムの各ビンの中心が整数になるように、±0.5の余裕を取るようにしています。

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

ここはポイントクラウドの場合と同じです。つまり以下のようにすると binary-image-pd0.txtに保存されます。

さて、上のパーシステント図を見ると(-5,-4)の所に何かbirth death pairが 集中しているようです。これが何か調べてみましょう。HomCloudのbirth pixel、 death pixel出力機能を使ってみましょう。これは島(連結成分)が生まれた/死んだ ときのピクセルの位置を出力するものです。birth/death pixelについて詳しくは https://arxiv.org/abs/1706.10082 の論文の2.3節、特にFig.2が参考になる と思います(この論文ではbirth/death positionという名前で呼んでいます)。 birth/death positionを出力するには以下のコマンドをターミナルから実行します。 -S yesによって出力をonにします。

これは各行、1列目がbirth time、2列目がdeath time、3列目が birth pixelの座標、4列目がdeath pixelの座標です。 ここで注意すべきは、座標は(y,x)の順に並んでいるということです。 これはHomCloudの仕様の問題ですが、全体の整合性を保つためどうしても こうなっているので気を付けてください。

さて、ここから(-5,-4)に対応するものだけを取り出しましょう。パイプ機能と grepというコマンドを利用すると必要なものだけ取り出せます(grepについて詳しくはご自分で 勉強してください)。

うまく行っているようです。0次のパーシステントホモロジーの場合には birth pixelのほうが重要です(その構造の中心におよそ対応します)。 そこでこのピクセルを入力画像の上に表示してみましょう。view_index_pict というプログラムを使います。

黒い道路状の部分に赤い点が表示されています。これは(-5, -4)というのは 幅の1/2が5ピクセルくらいの道状の形状に対応していることを意味しています。

強力な逆解析

ここでは0次のパーシステント図を見てきました。この図の上の各点は何らかの意味でデータの島構造を表現しているのですが、 上のbirth pixelではその「中心」とおぼしき一点のみを可視化しています。これはこれで手軽で便利なのですが 島を具体的に見ることができないのでしょうか。実は2次元画像の場合はそれを計算することが可能です。

pict.treeというモジュールで計算し、pict.show_volume_2dモジュールで可視化できます。

pict.treeのオプションの意味は以下の通りです。まず -m -T -t -s は最初にパーシステント図を計算したものと同じです。

-o binary-image-tree.pdgmで出力ファイルを指定します。.pdgmはHomCloudで共通的に使われるファイル拡張子です.

可視化には pict.show_volume_2d モジュールを使います。

この図を見ると、黒い領域の内側に細い赤い領域が塗られていることがわかります。拡大して見ると薄い赤と 濃い赤があることがわかると思います。これは薄い赤が対象となる領域で、濃い赤がbirth-pixelです。

黒い道路状の領域が(-5, -4)のbirth-death pairの鍵となっていることがよりわかると思います。

以上で白黒画像解析の解説は終わりです。