Игнорировать текст на картинке в вероятностном преобразовании линий Хафа в OpenCV

Моя задача: получить все координаты всех блоков текста

Я строю приложение для распознавания таблиц на картинках, фотографиях, документах. Я использую вероятностное преобразование Хафа, чтобы обнаружить все линии на фотографии, и мне нужно обнаружить маленькие и длинные линии.

Но у меня есть проблема: HoughLinesP обнаруживает текст в таблице как строку, я приложу картинку, чтобы описать его. На некоторых изображениях это не проблема, но на некоторых фотографиях он обнаруживает много ложных строк (ложных срабатываний), которые на самом деле представляют собой текст, а не строки.

Мое решение решить это:

  1. Определите все строки и отправьте их в массив
  2. Определите все координаты каждого текстового блока и поместите их в массив (мне понадобятся текстовые блоки для распознавания текста в таблице позже)
  3. Пройдите через все строки в массиве строк и через все текстовые блоки в массиве текста. Если строка находится на позиции в тексте, удалите ее из массива строк. Так что у меня будут все строки, которые не являются текстовыми. Я устраню ложные положительные признанные строки

Итак, мне нужно иметь все координаты всех блоков текста на изображении. Это должен быть прямоугольник вокруг блока текста

Это нормальная ситуация:
Источник: введите описание изображения здесь
Распознано: введите описание изображения здесь

Это неправильная ситуация:
Источник: введите описание изображения здесь
Распознано: введите описание изображения здесь

Вот мой код:

    gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    _, thresh = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY_INV + cv2.THRESH_OTSU)

    # Use Canny edge detection and dilate the edges for better result.
    edges = cv2.Canny(gray, 50, 150, apertureSize=3)
    kernel = np.ones((4, 4), np.uint8)
    dilation = cv2.dilate(thresh, kernel, iterations=1)

    # Perform HoughLinesP tranform.
    lines = cv2.HoughLinesP(dilation, rho=1, theta=np.pi / 180, threshold=35, minLineLength=50, maxLineGap=3)
    for line in lines:
        for x1, y1, x2, y2 in line:
            cv2.line(img, (x1, y1), (x2, y2), (0, 255, 0), 5)

    self.group_lines(lines)

    self.draw_recognized_lines(lines, img)

Эта строка - мой собственный алгоритм для объединения обнаруженной строки в одну строку (HoughtLinesP обнаруживает строку как совокупность множества маленьких строк):

    self.group_lines(lines)

PS Я попытался поиграть с minLineLength, maxLineGap, порогом, но каждое изображение не совпадает с предыдущим, каждая таблица отличается, поэтому я не могу использовать одно значение этих параметров для описания всех изображений.

Может быть, у вас будет другое решение, чтобы решить это?

Спасибо за помощь!

0 ответов

Другие вопросы по тегам