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