python 抽出した数字の判定
学習済みデータ読み込み
with open("digits.pkl", "rb") as fp:
clf = pickle.load(fp)
作成した学習済みデータを読み込んで数字の判定をしていく。
画像から領域を読み込む
detect_zip.pyというファイルを別に用意しており、そのファイルのdetect_zipno関数を呼び出し。
detect_zipno関数は引数で渡した画像データから郵便番号の領域を抽出してくれる関数。
cntsには抽出した領域のリスト(x,y,w,h)
imgには抽出した画像データ。
読み込んだデータをプロット
for i, pt in enumerate(cnts):
x, y, w, h = pt
# 枠線の輪郭分だけ小さくする
x += 8
y += 8
w -= 16
h -= 16
# 画像データを取り出す
im2 = img[y:y+h, x:x+w]
# データを学習済みデータに合わせる
im2gray = cv2.cvtColor(im2, cv2.COLOR_BGR2GRAY) # グレイスケールに
im2gray = cv2.resize(im2gray, (8, 8)) # リサイズ
im2gray = 15 - im2gray // 16 # 白黒反転
im2gray = im2gray.reshape*1 # 一次元に変換
# データ予測する
res = clf.predict(im2gray)
# 画面に出力
plt.subplot(1, 7, i + 1)
plt.imshow(im2)
plt.axis("off")
plt.title(str(res))
枠線を取り除く。
上記は枠線を取り除く処理を行わなかった時の出力結果である。
判定ができていないので枠を取り除く。
x,y,w,hそれぞれになんの値を入れると枠が無くなるのかは数字を入れながら手探りでやった。
・画像をグレースケールに変換.。
・学習済みデータに合わせるために画像を8✖️8ピクセルにリサイズ。
・白黒反転させて0~16までの値で表現(0に近いほど黒、16に近いほど白い)
・二次元配列を一次元に変換。一つの画像は8✖️8の合計64ピクセルの要素からなるので1行64列の一次元配列に変換。
あとは予測結果をタイトルに表示して終わり。
*1:-1, 64