やること
海外の質問サイトを見ていたら子ども向けのパズルを見つけました。正式名称は分からないですが「隠れた図形を探せ」的な名前だと思います。(画像クリックで拡大)
以前、イタリアンレストランの激ムズ間違い探しをPythonのOpencvで解きましたが(→画像差分で間違い探しを解く)、このパズルはその方法では解けません。物体の回転も考慮しなければいけません。今回はImageJ(のディストリビューションであるFiji)を使って「隠れた図形を探せ」を解いてみましょう。
使用したもの
今回はImageJではなく、様々なプラグインが追加されたFijiを使います。
Fijiには台形補正のプラグインが入っているためです。使い方は以下参照。
方針
物体の回転もあるため、フィルタを当てて畳み込み演算するような方法では計算量が膨大になりそうです。そこで、回転しても変化しない情報として「面積」に着目して絞り込むというアプローチにしましょう。
前処理
元画像
Plugins > Transform > Interactive Perspective
で台形補正を行います。
Process > Subtract Background
で背景のうねりを取り除きます。
Image > Type > 8-bit
Image > Adjust > Threshold
で二値化します。
面積測定と無関係な部分をペンとバケツで黒に塗ります。
ボタンを探す
ボタンを切り抜いて
Analyze > Analyze Particles
で面積を調べます。
元の画像に対して同様に
Analyze > Analyze Particles
で面積を検出します。(検出範囲を指定すること)
1箇所検出されました。たしかに一致していることがわかります。
ティーカップを探す
同じようにティーカップも探してみます。検出する面積は321-341。
4箇所検出されました。これだけ絞れれば簡単に見つかります。
おわりに
Analyze Particlesで「面積に応じて色を塗る」みたいなことができたらもっと楽にできそうな気がしますが、ImageJ(Fiji)はオプションに関するドキュメントが少ないようで分かっていません。