【Python】領域ごとに分割した画像をOCRする

これの続きのメモです。

前回は「領域ごとの外接四角形作れたぜイエーイ」まででした。

で、その四角形で切り抜くにはどうしたらええのん?

import cv2
import numpy as np

# 画像の準備
image_path = "gazou/no/path.jpeg"
image_2d = cv2.imread(image_path)
image_2d_processed = pre_process(image_2d) # 省略。ぼかして二値化して白黒反転。

# 領域の抽出
contours = cv2.findContours(image_2d_processed, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)

# 四角形で切り抜き
cropped_images = crop_images(image_2d, contours)

def crop_images(image_2d, contours):
   images = []
   for contour in contours:
       images.append(self.__crop_image(image_2d, contour))
   return images
   
def __crop_image(image_2d, contour):
   x, y, w, h = cv2.boundingRect(contour)
   cropped_img = image_2d[y:y+h, x:x+w]
   print(type(cropped_img))
   return cropped_img

cv2.boundingRect(contour)で、領域のx、y、w、hを取得するところまでは外接四角形描いたときと同じ。その後、image_2d[y:y+h, x:x+w]で、二次元配列の中から必要なエリアだけを抽出する。

二次元配列を抽出しただけなので、当然戻り値もRGB値の二次元配列状態。

でもそれだとOCRに掛からねぇのよ。

ということで

numpy.ndarrayをPIL.Image.Imageに変換する

ここで作ったOCRの処理に繋げる為には、画像がPIL.Image.Imageのインスタンスになっていないと使えませんぷー

ここまでやってきたopenCVを使った画像処理の結果はnumpy.ndarrayのインスタンスになっています。ぷー。

と言うわけで

if isinstance(image, np.ndarray):
   image = Image.fromarray(image)

「もしnumpy.ndarray形式だったらImage形式にフォーマットするよ」します。

このとき、isinstanceする為にはnumpyのimportが必要ですのでお忘れ無く。

ここまでできればこっちのものです。

前処理した画像を領域ごとに切り出して、Image形式に変換してOCR処理に投げればオッケー!大体理想通りに、エリアごとに文字を読み取ることができました。

問題はこの切り出した文字列の山の中から、目的の情報と不要な情報を見分ける方法なんですけどさぁてどうしてくれようか………………しかもフォーマットは無数に存在する前提…………機械学習の文字が脳裏にちらつく今日この頃です。

この記事が気に入ったらサポートをしてみませんか?