OpenCV-Python を使って囲碁の勝敗判定させてみよう (2)
久しぶりの更新. OpenCV-Python を使って囲碁の勝敗判定させてみよう (1) - 脱初心者を目指すの続編です.
前回,碁盤の四隅を検出して抜き出しするのに苦戦していたのですが,今回はいったん置いておいて面白そうなところを先にやってみようという試みです.
まず,元の画像はこれ.整地後の盤面です.
盤面の切り出し
透視変換行列を使って切り出します.入力画像上の4点と対応する出力画像上の4点を指定してあげます.
碁盤の交点のおおよその位置を計算
碁盤は19x19と決まってるので,単純に等間隔に点があるとして位置を出します. 一番外側の点については,あとの処理を考えて少し内側に置いています.
ノイズ処理
この後の処理をしやすいように,スムージングと膨張収縮処理をします.のっぺりした感じの画像が出力されます.
盤面の茶色をマスクする画像を作成
色空間の変換とかをすると,照明で画像に明るさのムラがあっても比較的きれいにできます.
ノイズ処理した画像とマスク画像を重ねる
黒石,白石,石が置かれていない目のどれであるかを判定
交点の位置の周りの色情報を取得して判定.(閾値は適当に設定)
白黒どちらの陣地になるかの判定
石が置かれてない目の周りの8方向を調べて,その数が多い方の色とする
地合い計算
上で判定したそれぞれの陣地の数を算出
コード
今回は,ipython notebook上で書いてみました.
閾値の設定と,白黒どちらの陣地になるかの判定のところがかなり適当なので改善していきたいと思います.