У меня есть набор изображений, каждое из которых содержит таблицу. На некоторых изображениях таблицы уже выровнены, а границы прорисованы. Нетрудно определить основную таблицу на этих изображениях с помощью функции обнаружения краев Canny. Тем не менее, некоторые изображения имеют свои таблицы без каких-либо границ, поэтому я пытаюсь определить таблицу на изображении и построить контуры ее границы, а также столбцы.
Я использую версию 3.4 openCV и подход, который я использую. обычно берется следующее:
- расширяет изображение в градациях серого, чтобы идентифицировать текстовые пятна
- применять функцию
cv2.findContours
, чтобы получить ограничивающие рамки текста. - кластеризовать ограничивающие рамкиполя в случае, если вместо основной таблицы были определены меньшие таблицы.
- попытайтесь нарисовать контуры в надежде определить границы таблицы.
Этот подход, кажется, работаетв определенной степени, но нарисованные контуры не совсем точны.
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)
Я пытаюсь добиться чего-то подобного изображенному ниже.
Короче говоря,Как я могу найти невидимые границы структуры таблицы в изображении, а также определить координаты х идентифицированных столбцов таблицы?
Я знаю, что приведенный выше код не на всехЯ оптимален для достижения требуемого результата, но я все еще изучаю openCV, поэтому я пробую различные подходы, но все еще не достиг желаемого результата.