LoginSignup
7
5

More than 5 years have passed since last update.

パズルゲームの画像を読み込んで各ブロックの並びを出力する

Last updated at Posted at 2014-06-05

目的

例えば, 下の画像を読み込んで,各ブロックの並びを判別したい.
Pazudora01.png

問題点

OpenCVを利用してTemplate Matchingで値を取得しようとしたが,一つ一つの画像をマッチングするのに時間がかかり,なおかつしきい値内の相関度の高い画像は全て出力されてしまうため選別するプログラムを書かないといけないのでコストが高かった.

方針

PILのライブラリにあるRGBのデータを用いて,各ブロックごとに切り出した画像のRGBデータの相関をとって一番基準値に近い色だと認識させる.

実装

PILのImageオブジェクトを用いる.

import numpy
from PIL import Image

def get_rgb(pic, box=""):
    if box == "":
        box = (0, 0, pic.width, pic.height)
    rgbimg = pic.crop(box).convert("RGB")
    rgb = np.array(rgbimg.getdata())
    return [__round(rgb[:,0]),
            __round(rgb[:,1]),
            __round(rgb[:,2])]

def color(array):
    col = {}
    col["red"] = [100, 20, 20] # 適当
    # この間に色をの基準値を埋め込んでいく
    col["heart"] = [100, 70, 70] # 適当

    max = 0
    result = ""
    for k, c in col.items:
       tmp = numpy.corrcoef(numpy.array(array), numpy.array(c))[0][1]
       if max < tmp:
           result = k
           max = tmp
    return result

def __round(array):
    return int(round(np.average(array)))

if __name__ == "__main__":
    '''
        xa : 始点, xs : Blockの幅, xb : 終点
     ya : 始点, ys : Blockの高さ, yb : 終点
    '''
    pic = Image.open("/path/to/Image.png", 'r')
    for i in xrange(6):
        for j in xrange(5):
           box = (xa + xs*i,
                  ya + ys*j,
                  xb + xs*i,
                  yb + ys*j)
           rgb = get_rgb(pic, box)
           print color(rgb)

これなら速度的には特に問題がなく,検出率もそれなり.たまにZero除算するらしく落ちる.

結論

パズドラって面白いんですかね.やったこと無いんですが.

7
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
5