Я пытаюсь идентифицировать различные текстовые сегменты на этом изображении, 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)