Игнорировать текст на картинке в вероятностном преобразовании линий Хафа в OpenCV - PullRequest
0 голосов
/ 05 марта 2019

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

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

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

Мое решение, чтобы решить это:

  1. Определить все строки и отправить их в массив
  2. Определить все координаты каждого блока text и передать их в массив (позже понадобятся текстовые блоки для распознавания текста в таблице)
  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)

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

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

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

...