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

У меня есть набор изображений, каждое из которых содержит таблицу. На некоторых изображениях таблицы уже выровнены, а границы прорисованы. Нетрудно определить основную таблицу на этих изображениях с помощью функции обнаружения краев Canny. Тем не менее, некоторые изображения имеют свои таблицы без каких-либо границ, поэтому я пытаюсь определить таблицу на изображении и построить контуры ее границы, а также столбцы.

Я использую версию 3.4 openCV и подход, который я использую. обычно берется следующее:

  1. расширяет изображение в градациях серого, чтобы идентифицировать текстовые пятна
  2. применять функцию cv2.findContours, чтобы получить ограничивающие рамки текста.
  3. кластеризовать ограничивающие рамкиполя в случае, если вместо основной таблицы были определены меньшие таблицы.
  4. попытайтесь нарисовать контуры в надежде определить границы таблицы.

Этот подход, кажется, работаетв определенной степени, но нарисованные контуры не совсем точны.

    img, contours, hierarchy = cv2.findContours(gray_matrix, cv2.RETR_LIST, 
    cv2.CHAIN_APPROX_SIMPLE)

    # get bounding boxes around any text
    boxes = []
    for contour in contours:
        box = cv2.boundingRect(contour)
        h = box[3]

    rows = {}
    cols = {}

    # Clustering the bounding boxes by their positions
    for box in boxes:
        (x, y, w, h) = box
        col_key = 10 # cell threshold
        row_key = 10 # cell threshold
        cols[row_key] = [box] if col_key not in cols else cols[col_key] + [box]
        rows[row_key] = [box] if row_key not in rows else rows[row_key] + [box]

    # Filtering out the clusters having less than 4 cols
    table_cells = list(filter(lambda r: len(r) >= 4, rows.values()))
    # Sorting the row cells by x coord
    table_cells = [list(sorted(tb)) for tb in table_cells]

    table_cells = list(sorted(table_cells, key=lambda r: r[0][1]))

    #attempt to identify columns

    max_last_col_width_row = max(table_cells, key=lambda b: b[-1][2])
    max_x = max_last_col_width_row[-1][0] + max_last_col_width_row[-1][2]

    ver_lines = []

    for box in table_cells:
        x = box[0][0]
        y = box[0][1]
        hor_lines.append((x, y, max_x, y))

    for box in table_cells[0]:
        x = box[0]
        y = box[1]
        ver_lines.append((x, y, x, max_y))

    (x, y, w, h) = table_cells[0][-1]
    ver_lines.append((max_x, y, max_x, max_y))
    (x, y, w, h) = table_cells[0][0]
    hor_lines.append((x, max_y, max_x, max_y))

    for line in ver_lines:
        [x1, y1, x2, y2] = line
    cv2.line(output_image, (x1, y1), (x2, y2), (0, 0, 255), 1)

    cv2.imshow('Proper Table Borders', output_image)

Я пытаюсь добиться чего-то подобного изображенному ниже.

a busy cat

Короче говоря,Как я могу найти невидимые границы структуры таблицы в изображении, а также определить координаты х идентифицированных столбцов таблицы?

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

1 Ответ

1 голос
/ 18 октября 2019

Попробуйте вертикальный профиль, который представляет собой количество текстовых (черных) пикселей с одинаковыми координатами X в определенном (Y0, Y1) диапазоне (вертикальный диапазон таблицы). Нулевые или близкие к нулю области будут обозначать границы столбцов таблицы. Вот примерный профиль, нарисованный от руки для вашего примера:

enter image description here

...