画像に含まれる文字列を分割する
Published:
By nobCategory: Posts
画像を読み込む
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)
グレースケールに変換する
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()
バウンディングボックスを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()