目的
例えば, 下の画像を読み込んで,各ブロックの並びを判別したい.
問題点
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除算するらしく落ちる.
結論
パズドラって面白いんですかね.やったこと無いんですが.