シルエットパズルの輪郭抽出とか

しばらく前に、シルエットパズルの自動生成をするプログラムをGitHubにあげていた。

GitHub - pzosdc/silhouette_generator

今回は、生成されたシルエットパズルの問題画像の輪郭抽出を行ったので、それを記録しておく。

図1 このシルエットを処理してみる

図1のようなシルエット画像を入力とする。 このパズルに対して輪郭をベクトル列として抽出したい。

調べてみたところ、「輪郭追跡」という手法が存在している。 輪郭追跡はピクセル単位で追跡していく手法だが、今回は、シルエットの辺の角度に興味がある。ピクセル単位で処理してしまうと後段において少々扱いづらいように思う。そこで、サブピクセルの情報も使うように若干の改変を加えたアルゴリズムとした。

図2 輪郭を描画した様子

無事に輪郭が得られた。ただ、頂点付近は不完全である。私のアルゴリズムでは頂点が丸くなる傾向にある。

それぞれのベクトルについて移動距離と偏角を求め、横軸を移動距離の累積、縦軸を偏角とする、時系列データに変換する。

図3 移動距離と偏角の変動

このような時系列にするモチベーションは、回転に強い形式にしたいためである。将来的にはShapeletのような手法を視野に入れている。 そのため、偏角の2π不定性を考慮して、単調増加になるように調整することを考えていた。

しかし残念なことに、今回の実装では、細かい振動がのってしまった。これは、おそらく、アンチエイリアスが効いているためと思われる。このままでもなんとかなりそうだが、少し気持ちが悪い。

時系列データとしても、不等間隔データであるため、少々扱いづらい。このあたりも調整が必要そうである。