OpenCV-Python を使って囲碁の勝敗判定させてみよう (2)

久しぶりの更新. OpenCV-Python を使って囲碁の勝敗判定させてみよう (1) - 脱初心者を目指すの続編です.

前回,碁盤の四隅を検出して抜き出しするのに苦戦していたのですが,今回はいったん置いておいて面白そうなところを先にやってみようという試みです.

まず,元の画像はこれ.整地後の盤面です.

f:id:asdm:20160726175327j:plain

盤面の切り出し

透視変換行列を使って切り出します.入力画像上の4点と対応する出力画像上の4点を指定してあげます.

f:id:asdm:20160726175757p:plain

碁盤の交点のおおよその位置を計算

碁盤は19x19と決まってるので,単純に等間隔に点があるとして位置を出します. 一番外側の点については,あとの処理を考えて少し内側に置いています.

f:id:asdm:20160726175925p:plain

ノイズ処理

この後の処理をしやすいように,スムージングと膨張収縮処理をします.のっぺりした感じの画像が出力されます.

f:id:asdm:20160726180211p:plain

盤面の茶色をマスクする画像を作成

色空間の変換とかをすると,照明で画像に明るさのムラがあっても比較的きれいにできます.

f:id:asdm:20160726180410p:plain

ノイズ処理した画像とマスク画像を重ねる

f:id:asdm:20160726180552p:plain

黒石,白石,石が置かれていない目のどれであるかを判定

交点の位置の周りの色情報を取得して判定.(閾値は適当に設定)

f:id:asdm:20160726180643p:plain

白黒どちらの陣地になるかの判定

石が置かれてない目の周りの8方向を調べて,その数が多い方の色とする

f:id:asdm:20160726180901p:plain

地合い計算

上で判定したそれぞれの陣地の数を算出

コード

今回は,ipython notebook上で書いてみました.

github.com

閾値の設定と,白黒どちらの陣地になるかの判定のところがかなり適当なので改善していきたいと思います.