昨日はオブジェクトから輪郭を抽出する処理を書きました。今日は、
輪郭を等間隔に間引いたものの形状がどうなるか見てみます。前処理としてオリジナルデータのオブジェクト領域が小さかったのでscipyのzoom関数で2倍に拡大してから処理に入っています。あと、符号化もしてます。等間隔に間引くだけなら符号化する必要はないかもしれませんが、あとで何かに使えるかもしれないので、符号化してみました。
# -*- coding: utf-8 -*- import random import re import numpy as np from numpy import arange import matplotlib.pyplot as plt from scipy.ndimage import zoom def rawObjectToMatrix(ro): ret = [] lines = ro.splitlines() for line in lines: if line.strip()=="": continue ret.append(map(lambda x: 0 if x == " " else 1, line)) whiteRow = [[0 for _ in xrange(len(ret[0]))]] return whiteRow + ret + whiteRow def pb(lst2d): ret = "" for lst in lst2d: lst = map(abs, lst) ret += "".join(map(str, lst)) + "\n" print "" print ret def readMyData(): with open("a.txt", 'r') as fp: text = fp.read() objectRawDataList = re.split(r"\n\n", text) objectRawDataList = filter(lambda x: x != "", objectRawDataList) return map(lambda ro: rawObjectToMatrix(ro), objectRawDataList) lst = readMyData() sampleMatrix = zoom(np.array(lst[5]), 1.5) pb(sampleMatrix) height = sampleMatrix.shape[0] width = sampleMatrix.shape[1] mat = sampleMatrix.copy() for rn, _ in enumerate(mat): for cn, __ in enumerate(_): if mat[rn, cn] == 1 and mat[rn + 1, cn] == 1: mat[rn, cn] = 0 out = mat mat = sampleMatrix.copy() for rn, _ in enumerate(mat): for cn, __ in enumerate(_): if mat[(height - 1) - rn, cn] == 1 and mat[(height - 1) - rn - 1, cn] == 1: mat[(height - 1) - rn, cn] = 0 out |= mat mat = sampleMatrix.copy() for rn, _ in enumerate(mat): for cn, __ in enumerate(_): if mat[rn, cn] == 1 and mat[rn, cn + 1] == 1: mat[rn, cn] = 0 out |= mat mat = sampleMatrix.copy() for rn, _ in enumerate(mat): for cn, __ in enumerate(_): if mat[rn, (width - 1) - cn] == 1 and mat[rn, (width - 1) - cn - 1] == 1: mat[rn, (width - 1) - cn] = 0 out |= mat pb(out) firstPosFlat = out.flatten().argmax() pos = firstPosFlat / width, firstPosFlat % width startPos = pos code = [] while True: if out[pos[0] - 1, pos[1] ] == 1: out[pos[0] - 1, pos[1] ] = 2 pos = pos[0] - 1, pos[1] code.append((-1, 0)) elif out[pos[0] - 1, pos[1] + 1] == 1: out[pos[0] - 1, pos[1] + 1] = 2 pos = pos[0] - 1, pos[1] + 1 code.append((-1, 1)) elif out[pos[0] , pos[1] + 1] == 1: out[pos[0] , pos[1] + 1] = 2 pos = pos[0] , pos[1] + 1 code.append((0, 1)) elif out[pos[0] + 1, pos[1] + 1] == 1: out[pos[0] + 1, pos[1] + 1] = 2 pos = pos[0] + 1, pos[1] + 1 code.append((1, 1)) elif out[pos[0] + 1, pos[1] ] == 1: out[pos[0] + 1, pos[1] ] = 2 pos = pos[0] + 1, pos[1] code.append((1, 0)) elif out[pos[0] + 1, pos[1] - 1] == 1: out[pos[0] + 1, pos[1] - 1] = 2 pos = pos[0] + 1, pos[1] - 1 code.append((1, -1)) elif out[pos[0] , pos[1] - 1] == 1: out[pos[0] , pos[1] - 1] = 2 pos = pos[0] , pos[1] - 1 code.append((0, -1)) elif out[pos[0] - 1, pos[1] - 1] == 1: out[pos[0] - 1, pos[1] - 1] = 2 pos = pos[0] - 1, pos[1] - 1 code.append((-1, -1)) if pos == startPos: break pb(out) mabiki = [1, 2, 4, 8, 16, 32] for m in mabiki: pr = 0 pc = 0 p = [] for n, c in enumerate(code): dr, dc = c pr += dr pc += dc if n % m == 0: p.append((pr, pc)) x = map(lambda x: x[1], p) y = map(lambda x: x[0], p) x += [0] y += [0] fig, ax = plt.subplots(1) ax.plot(x, y) fig.savefig("/Users/kei/Desktop/mabiki%d.png"%m)
出力(上から順に、オリジナル, 2, 4, 8, 16, 32ステップごとにサンプルをとった場合の集合):