Извлечение и сохранение символов из изображения - PullRequest
3 голосов
/ 03 марта 2020

Я следую за этим постом: Как извлечь из изображения только символы?

Это решение идеально подходит для меня (с некоторыми изменениями) для его желаемой цели. Тем не менее, я пытаюсь сделать еще один шаг, сохранив каждого персонажа. Таким образом, в примере этого поста я sh сохраню символы K, N и M в качестве собственных отдельных изображений. Я попытался выполнить итерацию вложенного if l oop с помощью функции cv2.imwrite с объектом прямоугольника, хотя в конечном итоге получилось 7 изображений, содержащих общее изображение с дополнительным прямоугольником, чтобы каждый раз выделять следующий контур.

example image:

1 Ответ

1 голос
/ 04 марта 2020

Вот простой подход:

  1. Получение двоичного изображения. Загрузка изображения, оттенки серого, Порог Оцу

  2. Извлечение ROI. Поиск контуров и сортировка слева направо, чтобы убедиться, что у нас есть контуры в правильном порядке с imutils.contours.sort_contours , Мы фильтруем, используя область контура , затем извлекаем и сохраняем каждый ROI, используя Numpy срезы.


Ввод

enter image description here

Двоичное изображение

enter image description here

Обнаруженные символы выделены зеленым цветом

enter image description here

Извлеченные ROI

enter image description here

Код

import cv2
from imutils import contours

# Load image, grayscale, Otsu's threshold
image = cv2.imread('1.png')
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
thresh = cv2.threshold(gray, 0, 255, cv2.THRESH_OTSU + cv2.THRESH_BINARY_INV)[1]

# Find contours, sort from left-to-right, then crop
cnts = cv2.findContours(thresh, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
cnts = cnts[0] if len(cnts) == 2 else cnts[1]
cnts, _ = contours.sort_contours(cnts, method="left-to-right")

# Filter using contour area and extract ROI
ROI_number = 0
for c in cnts:
    area = cv2.contourArea(c)
    if area > 10:
        x,y,w,h = cv2.boundingRect(c)
        ROI = image[y:y+h, x:x+w]
        cv2.imwrite('ROI_{}.png'.format(ROI_number), ROI)
        cv2.rectangle(image, (x, y), (x + w, y + h), (36,255,12), 2)
        ROI_number += 1

cv2.imshow('thresh', thresh)
cv2.imshow('image', image)
cv2.waitKey()
...