動的輪郭法
動的輪郭法(Active contour)というアルゴリズムは便利でなかなかおもしろいのであるが、応用範囲があまりないからかマイナーな分節化アルゴリズムの一つである。さっきまったく別のことで検索していたら、たまたまこんなYahoo知恵袋の質問と解答に行き当たった。
https://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q12318043457
で、回答者が「Oval ROIを使って手で測れ」といっている。まあそうなのだが、質問者の意図はもっと自動的に(つまり客観的に)やりたいということなので、あまりよい回答ではないなあ、と思った(私自身はYahooに回答したことがないので僭越ではあるのだが)。FijiにはPlugins>Segmentation>LevelSetという昔からあるプラグインが同梱されていて、この機能の一部が動的輪郭法である。これは、仮想上の輪ゴムを伸ばしたり縮めたりしながら形にフィットさせる、という手法で、輪ゴムの張力を上げ下げすることでどのような輪郭を分節化したいか、調整することができる。ふにゃふにゃな形にピッタリフィットするようにするには張力を上げればよいし、ふにゃふにゃなかたちにフィットしないでもなめらかな輪郭を得たいならば輪ゴムの張力を上げる。単純にはこのようなことで、実際にはなにをもって形とするかパラメータ設定がややこしくなったりする(はっきりした形ならラクだが、境界が曖昧だと工夫するひつようがある)。
上のCの形状の内径であれば、境界がくっきりしているのでまさに動的輪郭法の出どころである。円をフットさせる、ということだ。ちょっとやってみたらすぐにできた。
時間がないのに思わずやってみてしまった…
あと実はハフ変換という手法もあって、これでも円の検出が一瞬でできるので、たぶん内径と外径を同時にはかることができるだろう。これは、プラグインを入れないといけないので、面倒なので試していない。
むむ。単に数理形態演算でやればいいんじゃねーか。というわけで、Plugins>MorphoLibJ>Filtering>Morphological Filtersで、閉鎖処理をしてみたら、ばっちり可能であった。
話を元に戻すと、LevelSetのプラグインはErwinという人が実装したプラグインで、2008年頃、EMBLでやったハッカソンにきてコードの最後の部分を書いていた。なにか、なつかしい感じである。チュートリアルとかないし、fast marching(wand toolの精密版)とかも一緒になっていてわかりにくいUIになってしまっている。あと、Previewができるようにするといいわなー、とか思うけど、私は手を出す暇がないな。これこそ、vibe codingで効率的にアップグレードできる感じのプロジェクトである。