blog

画像に含まれる文字列を分割する

Published:

By nob

Category: Posts

Tags: 文字認識 OpenCV Python

画像を読み込む

import cv2
import matplotlib.pyplot as plt

image = cv2.imread("data/pism/image/table-1-b-0632.png")
print(image.shape)

plt.imshow(image)
plt.show()
(28, 35, 3)

fig-1

グレースケールに変換する

gray_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
print(gray_image.shape)
(28, 35)

バウンディングボックスを求める

import numpy as np

contours, hierarchy = cv2.findContours(
    gray_image, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE
)

bboxes = []
for contour in contours:
    x, y, w, h = cv2.boundingRect(contour)
    bboxes.append([x, y, w, h])

char_bbox_image = np.zeros_like(gray_image)
for x, y, w, h in bboxes:
    char_bbox_image = cv2.rectangle(
        char_bbox_image, (x, y), (x + w, y + h), 255, 1
    )

plt.imshow(char_bbox_image, cmap=plt.cm.gray)
plt.show()

fig-2

バウンディングボックスをX座標でソートする

bboxes = sorted(bboxes, key=lambda x: x[0])

バウンディングボックスに含まれる文字を表示する

char_images = []
for x, y, w, h in bboxes:
    char_image = gray_image[y : y + h, x : x + w]
    char_images.append(char_image)

fig, axs = plt.subplots(1, len(bboxes), figsize=(6, 4))

# for nrow == ncol == 1
axs = np.array(axs).reshape(-1)

for i, char_image in enumerate(char_images):
    axs[i].imshow(char_image, cmap=plt.cm.gray)

plt.tight_layout()
plt.show()

fig-3