Моя задача:
Получить все координаты всех блоков текста
Я создаю приложение для распознавания таблиц на фотографиях, фотографиях, документах.
Я использую вероятностное преобразование Хафа, чтобы обнаружить все линии на фотографии, и мне нужно обнаружить маленькие и длинные линии.
Но у меня проблема : HoughLinesP распознает текст в таблице как строку, я приложу картинку, чтобы описать его. На некоторых изображениях это не проблема, но на некоторых фотографиях он обнаруживает много ложных строк (ложных срабатываний), которые на самом деле представляют собой текст, а не строки.
Мое решение, чтобы решить это:
- Определить все строки и отправить их в массив
- Определить все координаты каждого блока text и передать их в массив (позже понадобятся текстовые блоки для распознавания текста в таблице)
- Пройти через все строки в массиве строк и через все текстовые блоки в массиве текста. Если строка находится на позиции в тексте, удалите ее из массива строк. Так что у меня будут все строки, которые не являются текстовыми. Я устраню ложных срабатываний признанных линий
Итак, мне нужно иметь все координаты всех блоков текста на изображении. Это должен быть прямоугольник вокруг блока текста
Это нормальная ситуация:
Источник: введите описание изображения здесь
Распознано: введите описание изображения здесь
Это неправильная ситуация:
Источник: введите описание изображения здесь
Распознано: введите описание изображения здесь
Вот мой код:
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 , но каждое изображение не совпадает с предыдущим, каждая таблица отличается, поэтому я не могу используйте одно значение этих параметров для описания всех изображений.
Может быть, у вас будет другое решение, чтобы решить его?
Спасибо за помощь!