тессеракт для пустой ячейки таблицы - PullRequest
0 голосов
/ 17 сентября 2018

Image to read

Я использую tesseract для преобразования изображения в текст на экземпляре CentOS, но я не могу обрабатывать пустые ячейки.

Вывод, полученный из tesseract :

Юридическое лицо Категория проекта Пн 08/20 Вт 08/21 Ср 08/22 Чт Пт 08/23 пт 08/24 сб 08/25 вс 08/26 итого

тест Улучшения разработки - Improvem 8,00 8,00 8,00 8,00 8,00 40,00 H '9

Обратите внимание, что во второй строке есть пробел после последних 8 и до 40 (в основном ячейки Sat / Sun пусты)

Ответы [ 3 ]

0 голосов
/ 21 сентября 2018
0 голосов
/ 23 сентября 2018

Я бы попытался определить местонахождение региона, содержащего текст, перед выполнением части OCR, сделав его моей рентабельностью инвестиций. Затем для части OCR используйте ROI вместо всего изображения. Затем вы можете выполнить поиск, если область интереса содержит контуры, тогда она должна выполнить OCR, иначе сделайте пробел. Надеюсь, это поможет, ура!

Пример:

import cv2
import numpy as np

img = cv2.imread('table_so.png')

res = cv2.resize(img,None,fx=0.8, fy=0.8, interpolation = cv2.INTER_CUBIC)
h,w,ch = res.shape
cv2.rectangle(res, (0,0), (w,h), (0,0,0), 10)

gray = cv2.cvtColor(res, cv2.COLOR_BGR2GRAY)
_, thresh = cv2.threshold(gray,220,255,cv2.THRESH_BINARY)
_, contours, hierarchy = cv2.findContours(thresh,cv2.RETR_TREE,cv2.CHAIN_APPROX_NONE)
sort_cnts = sorted(contours, key=lambda ctr: cv2.boundingRect(ctr)[0] + cv2.boundingRect(ctr)[1] * res.shape[1] )

ROIs = []

for cnt in sort_cnts:
    x,y,w,h = cv2.boundingRect(cnt)
    if 2000 > w > 70 and h < 100:
        ROI = res[y:y+h, x:x+w]
        ROIs.append(ROI)
        cv2.rectangle(res, (x,y), (x+w,y+h), (0,255,0), 2)

for i in ROIs:
    roi = i
    gray = cv2.cvtColor(roi, cv2.COLOR_BGR2GRAY)
    _, thresh = cv2.threshold(gray,220,255,cv2.THRESH_BINARY)
    _, contours, hierarchy = cv2.findContours(thresh,cv2.RETR_TREE,cv2.CHAIN_APPROX_NONE)
    if len(contours) > 1:
        print('DO OCR HERE')
    else:
        print('BLANK SPACE')
    cv2.imshow('img', gray)
    cv2.waitKey(0)
    cv2.destroyAllWindows()

cv2.imshow('img', res)

Результат:

enter image description here

(Зеленые поля - это ROI)

  • ЗДЕСЬ ЗДЕСЬ
  • ЗДЕСЬ ЗДЕСЬ
  • ЗДЕСЬ ЗДЕСЬ
  • ЗДЕСЬ ЗДЕСЬ
  • ЗДЕСЬ ЗДЕСЬ
  • ЗДЕСЬ ЗДЕСЬ
  • ЗДЕСЬ ЗДЕСЬ
  • ЗДЕСЬ ЗДЕСЬ
  • ЗДЕСЬ ЗДЕСЬ
  • ПУСТОЕ ПРОСТРАНСТВО
  • ПУСТОЕ ПРОСТРАНСТВО
  • ПУСТОЕ ПРОСТРАНСТВО
0 голосов
/ 20 сентября 2018

Вы можете либо обучить Tesseract и заставить его распознавать пробелы (не рекомендуется, так как это может испортить 100% вывод, который вы получаете), либо решить проблему путем кодирования.К сожалению, нет возможности просто обучить Тессеракту так, как вы этого хотите.

Лучшее решение, которое я вижу здесь, это отображение 0 или чего-то похожего (любой персонаж, с которым вам удобно) в субботу и воскресенье, так чтоТессеракт может видеть их, и вы можете реагировать на это.

...