Определите текстовые сегменты на изображении - PullRequest
0 голосов
/ 16 июня 2020

Я пытаюсь идентифицировать различные текстовые сегменты на этом изображении, https://imgur.com/jv2w9Mk, и использовать оптическое распознавание символов, чтобы сохранить их в базе данных. Всего у меня около 900 страниц, у всех одинаковый макет.

С моим текущим кодом я могу идентифицировать следующее: https://imgur.com/W5LWbWb. Как видите, контуры иногда бывают слишком маленькими ни по высоте, ни по ширине. Что касается ширины, я думал о расширении ширины поля до ширины столбца, но я не уверен, как туда добраться. Я не знаю, как действовать в случаях, когда высота коробки слишком мала.

import cv2
import pytesseract


# Load image
page = cv2.imread("583_raw.jpg")

# Find contours
gray = cv2.cvtColor(page,cv2.COLOR_BGR2GRAY) # grayscale
_,thresh = cv2.threshold(gray,150,255,cv2.THRESH_BINARY_INV) # threshold
kernel = cv2.getStructuringElement(cv2.MORPH_CROSS,(3,3))
dilated = cv2.dilate(thresh,kernel,iterations = 13) # dilate
contours, hierarchy = cv2.findContours(dilated,cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_NONE) # get contours

# Container to store content of each text box
page_dictlist = []

# For each contour found, draw a rectangle around it on original image 
for i, contour in enumerate(contours):

    # Store page number
    page_dict = {'page': 583}

    # Get rectangle bounding contour
    [x,y,w,h] = cv2.boundingRect(contour)

    # Discard areas that are too large
    if h > 600 and w > 600:
        continue

    # Discard areas that are too small
    if h < 150 or w < 200:
        continue

    # Draw contour
    cv2.rectangle(page, (x, y), (x+w, y+h), (255, 0, 255), 2)

    # Tesseract
    text_box = page[int(y):int(y+h), int(x):int(x+w)]
    text_raw = pytesseract.image_to_string(text_box, lang='deu')

    # Store text box information
    page_dict['text'] = text_raw
    page_dictlist.append(page_dict)

cv2.imwrite("583_contour.jpg", page)

...