あなたが手書きした文字を認識するPythonのライブラリはいくつかありますが、手書き文字認識を実現するためのライブラリはそれほど多くありません。そこで、今回はPythonを使って紙の上の字を認識する方法について紹介します。
必要なライブラリ
まず、必要なライブラリをインストールします。OpenCV、Numpy、Matplotlibを使用します。
pip install opencv-python numpy matplotlib
手順
- 画像を取得する
- 画像を前処理する
- 文字領域を検出する
- 文字画像を1つの画像にまとめる
- 文字画像をニューラルネットワークに入力し、文字を認識する
1. 画像を取得する
まずは、紙に書かれた文字を撮影して画像を取得します。カメラで撮影することもできますが、今回はスキャナーを使って画像を取得します。
import cv2
img = cv2.imread('input.jpg')
2. 画像を前処理する
次に、画像を前処理します。前処理としては、画像をグレースケールに変換し、二値化処理を行います。また、ノイズを除去するために、画像を平滑化します。
import numpy as np
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
gray = cv2.GaussianBlur(gray, (5, 5), 0)
_, binary = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY_INV+cv2.THRESH_OTSU)
kernel = np.ones((3, 3), np.uint8)
binary = cv2.erode(binary, kernel)
3. 文字領域を検出する
次に、文字領域を検出します。文字領域を検出するためには、輪郭検出を行います。輪郭検出では、画像中の輪郭を検出し、その輪郭の面積、位置、形状などを抽出することができます。
contours, hierarchy = cv2.findContours(binary, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
4. 文字画像を1つの画像にまとめる
次に、検出された文字領域を1つの画像にまとめます。文字領域をまとめる際には、輪郭の位置情報を利用します。
num = 0
for i in
```python
contours:
x, y, w, h = cv2.boundingRect(c)
if w > 10 and h > 10:
num += 1
roi = binary[y:y+h, x:x+w]
cv2.imwrite('roi_{}.png'.format(num), roi)
5. 文字画像をニューラルネットワークに入力し、文字を認識する
最後に、文字画像をニューラルネットワークに入力し、文字を認識します。文字認識には、多層ニューラルネットワークを使用します。
from keras.models import load_model
model = load_model('model.h5')
labels = ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z']
def recognize_character(image_path):
image = cv2.imread(image_path, cv2.IMREAD_GRAYSCALE)
image = cv2.resize(image, (28, 28))
image = np.reshape(image, (1, 28, 28, 1))
image = image / 255.0
result = model.predict(image)
result = result.tolist()[0]
index = result.index(max(result))
return labels[index]
results = []
for i in range(1, num+1):
character = recognize_character('roi_{}.png'.format(i))
results.append(character)
print(''.join(results))
以上で、紙の上の字を認識する方法について紹介しました。文字認識の精度を向上させるためには、画像処理のパラメータを調整したり、ニューラルネットワークの学習データを増やしたりすることが必要です。