数理形態学 — Mathematical morphology
2D/3D Cellular Automaton上の個体・細胞の分布を評価したい。 そのためには白黒の二値画像処理の手法が結構使える。
- 図形 X
- それぞれのノード(画素)の在・不在情報の集合。 $x \in X$
- 構造要素 (Structuring Element: SE)
- さまざまな処理を施すために用いられる単位図形のようなもの。 例えば、原点とそのムーア近傍。 $b \in B$
- voxel
- 3D空間における単位。2Dでいうpixel。
基本処理
Translation 平行移動
Dilation 膨張
X と B のMinkowski和。 X を B の範囲でずらしながらunionを取ったもの。 国土をX 、半径12海里の円をSEとした、領空みたいなイメージ。
Erosion 浸食
X と B のMinkowski差。 X を B の範囲でずらしながらintersectを取ったもの。 SEを消しゴムとして X の外周上を走らせ、削るイメージ。
Opening
浸食してから膨張する。 X からハミ出ないようにSEを滑らせた軌跡に相当する。 トゲの先端や X 外部のチリなど、SEより小さい構造が削られて小さくなる。 特定の形を持ったSEを使えば、それを含む領域だけを抽出するのにも使える。
元画像との差分 $X - (X \circ B)$ は Top Hat と呼ばれ、 トゲの先っちょや背景のノイズ成分が得られる。
Closing
膨張してから浸食する。 X の外部をOpeningすることと同義。 X 内部のヒビやチリなど、SEより小さい構造が塗りつぶされ、大きくなる。
元画像との差分 $(X \bullet B) - X$ は Black Hat と呼ばれ、 X 内のヒビやトゲの根元らへんが得られる。
応用
Pattern Spectrum, サイズ分布
小さいSEから順に大きくしながら Openingで削れた部分の面積を記録していく。 元画像の面積で割ったものはサイズ密度関数(size density function)と呼ばれる。 細かいギザギザを含む図形ほど小さいSEで削れる成分が多い。 要約統計量としてはモーメントやエントロピーが使える。
Morphological gradient
dilationとerosionの差。 エッジ検出法のひとつ。 X上の境界が欲しい場合は$X - (X \ominus B)$。 背景側の境界が欲しい場合は$(X \oplus B) - X$。
ノイズ除去
- 平滑化フィルタ
- SEを端から端まで動かしつつ、その中に含まれる画素の平均値を中央画素に適用していく。 Gaussian filterのように、遠いものほど軽くなるように重み付けをする場合もある。 いずれにせよ、エッジがボヤけてしまうのが問題。
- Median filter
- 平均値ではなく中央値で置き換える。 エッジは保存されるが、ソートを伴うので計算量は多め。
ライブラリ
画像処理を施す
- scikit-image
- Pythonモジュール。 scipy.ndimage を更に拡張したもの。 numpy.array を使って表現されるので汎用関数の適用も容易。
- OpenCV (Open Source Computer Vision)
- C++、Pythonなど。信頼と実績があるらしく、書籍やネット上の情報も多い。
- CImg
- C++。ヘッダひとつincludeするだけ。 ドキュメントも良さげ。
- imager
- R。新しめでドキュメントも充実。内部でCImgを利用。 CairoやX11に依存しているので、 Rもそれらしくビルドされてる必要がある。
- mmand
- R。READMEは良さげ。内部はRcpp。 ほとんど他のライブラリに依存していないのでインストールしやすい。
- Morpho
- R。ドキュメント不足。