2010/08/28

ジグソーパズルプログラム ピース情報の取得方法

パズルプログラムの実験を継続中です。


ジグソーパズルを解くためには、1ピースごとの形状を把握しなければなりません。
輪郭抽出でピースの外周の情報は得られるのですが、マッチングに使用する際は外周の輪郭情報を上下左右の4区画に分かれていなければ使い物になりません。
4区画に分けるには、ピースの4つの角を検出しなければならないので、角を検出するところからやっていきます。

外周の輪郭情報から直角を抽出すればいいのではと考え、輪郭の数点に直線を割り当てたり、ハフ変換で画像内の直線を検出したりしましたが、ノイズが多かったり検出されるべき角が検出されなかったりと、結果はあまりよいものではありませんでした。

んで、OpenCV本をめくって何かいい方法が無いかを探したところ、モルフォロジー演算というのが使えそうでした。

モルフォロジー演算のクロージング処理は下方向(暗い点)のアウトライヤーを除去し、オープニング処理は上方向(明るい点)のアウトライヤーを除去してくれるようです。

実際にピースの画像にモルフォロジー演算をやってみたのが下記の図となります。











今回はクロージング処理でピースのへこみ部分を除去し、その後オープニング処理でピースの出っ張り部分を除去することに成功しました。いろんなピースでやってみましたが、ほとんどのピースで4つの角を検出することができました。

モルフォロジー演算を行うときに、カーネルの大きさを自分で指定することができるのですが、このカーネルの大きさを取り除きたい部分の大きさよりも少し大きめにすると、うまく除去してくれるようです。(ただし、ピースが斜めに配置されていると、カーネルが短形なためモルフォロジー演算を行ってもピースの角を抽出することはできなくなります。)

ピースの4つの角を抽出できたので、あとは上下左右の形状を調べるだけです。

ひとまず「出っ張りがある」「へこみがある」「何も無い(直線)」の3つに区分したいので、
x方向に伸びる辺は上下5~10ピクセル、y方向に伸びる辺は左右5~10ピクセルの輝度を順次調べていけばよさそうです。

ではまた。

0 件のコメント:

コメントを投稿