Как убрать ломаные горизонтальные линии из сканированного изображения таблицыPython

Программы на Python
Ответить Пред. темаСлед. тема
Anonymous
 Как убрать ломаные горизонтальные линии из сканированного изображения таблицы

Сообщение Anonymous »

Исходное изображение содержит таблицы, над которыми я выполнил эрозию/расширение, используя горизонтальное и вертикальное ядро ​​для поиска/обнаружения горизонтальных и вертикальных линий. Затем я использовал функции findContours и drawContours, чтобы скрыть линии.
Проблема: я обрабатываю различные изображения с разной толщиной горизонтальных линий. /вертикальные линии, и я использую 10 пикселей размера для рисования поверх этих вертикальных/горизонтальных линий, чего для некоторых изображений недостаточно и некоторые линии остаются видимыми.
Как я могу удалить эти оставшиеся строки таким образом, чтобы не менялись символы?
исходное изображение: https://drive.google.com/file/d/1P8Aw54 ... /view?usp= совместное использование
исходного изображения (понижено из-за ограничения размера SO):
[img]https://i .sstatic.net/iTWPNzj8.jpg[/img]

преобразованное изображение:
[img]https:/ /i.sstatic.net/gY8FuQwI.jpg[/img]

редактировать (добавлен исходный код):
import cv2
import imutils
import pytesseract
from pytesseract import Output
import numpy as np

debug = True

image = cv2.imread('HAL.jpg')
# origin = image.copy()
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
thresh = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY_INV + cv2.THRESH_OTSU)[1]
# print(thresh) # two values are 0 for black, and 255 for white

mask = np.zeros(thresh.shape, np.uint8)
mask.fill(255)

origin = thresh.copy()

# Remove vertical lines
vertical_kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (1, 40))

if debug:
cv2.imshow("before removing vlines", imutils.resize(thresh, width=800))
cv2.waitKey(0)

morph_iterations = 4
remove_vertical = thresh.copy()

# manually check what iteration of erode/dilate will be give good result

# removes all text
for _ in range(2):
remove_vertical = cv2.morphologyEx(
remove_vertical, cv2.MORPH_ERODE, vertical_kernel, iterations=1
)
if debug:
cv2.imshow("see runtime changes", imutils.resize(remove_vertical, width=800))
cv2.waitKey(0)

# dilate to complete broken lines
for _ in range(morph_iterations*2):
remove_vertical = cv2.morphologyEx(
remove_vertical, cv2.MORPH_DILATE, vertical_kernel, iterations=1
)
if debug:
cv2.imshow("see runtime changes", imutils.resize(remove_vertical, width=800))
cv2.waitKey(0)

# undo dilation using half iteration to keep incomplete lines
for _ in range(morph_iterations//2):
remove_vertical = cv2.morphologyEx(
remove_vertical, cv2.MORPH_ERODE, vertical_kernel, iterations=1
)
if debug:
cv2.imshow("see runtime changes", imutils.resize(remove_vertical, width=800))
cv2.waitKey(0)

contours = cv2.findContours(remove_vertical, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
contours = imutils.grab_contours(contours)

for c in contours:
cv2.drawContours(origin, [c], -1, (0, 0, 0), 10)
# cv2.drawContours(source_image, [c], -1, (255, 255, 255), 10)

if debug:
cv2.imshow("after drawing contours on source", imutils.resize(origin, width=800))
cv2.waitKey(0)
cv2.destroyAllWindows()

# Remove horizontal lines
horizontal_kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (40, 1))

if debug:
cv2.imshow("before removing hlines", imutils.resize(thresh, width=800))
cv2.waitKey(0)

morph_iterations = 4
remove_horizontal = thresh.copy()

# removes all text
for _ in range(2):
remove_horizontal = cv2.morphologyEx(
remove_horizontal, cv2.MORPH_ERODE, horizontal_kernel, iterations=1
)
if debug:
cv2.imshow("see runtime changes", imutils.resize(remove_horizontal, width=800))
cv2.waitKey(0)

# dilate to complete broken lines
for _ in range(morph_iterations*2):
remove_horizontal = cv2.morphologyEx(
remove_horizontal, cv2.MORPH_DILATE, horizontal_kernel, iterations=1
)
if debug:
cv2.imshow("see runtime changes", imutils.resize(remove_horizontal, width=800))
cv2.waitKey(0)

for _ in range(morph_iterations//2):
remove_horizontal = cv2.morphologyEx(
remove_horizontal, cv2.MORPH_ERODE, horizontal_kernel, iterations=1
)
if debug:
cv2.imshow("see runtime changes", imutils.resize(remove_horizontal, width=800))
cv2.waitKey(0)

contours = cv2.findContours(remove_horizontal, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
contours = imutils.grab_contours(contours)

for c in contours:
# cv2.drawContours(remove_horizontal, [c], -1, (0, 0, 0), 2)
cv2.drawContours(origin, [c], -1, (0, 0, 0), 10)
# cv2.drawContours(source_image, [c], -1, (255, 255, 255), 10)

if 'debug':
cv2.imshow("after drawing contours on source", imutils.resize(origin, width=800))
cv2.waitKey(0)
cv2.destroyAllWindows()

square_kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (2, 2))

# try different configs of dilate/erode
i_counter = 0
while True:
i_counter += 1
key = cv2.waitKey(0)
if key == 106:

origin = cv2.morphologyEx(
origin, cv2.MORPH_ERODE, square_kernel, iterations=1
)
if key == 107:

origin = cv2.morphologyEx(
origin, cv2.MORPH_DILATE, square_kernel, iterations=1
)

if key == 108:

# create a mask
mask = cv2.morphologyEx(
origin, cv2.MORPH_OPEN, horizontal_kernel, iterations=1
)

cv2.imshow("noise after erode", imutils.resize(mask, width=600))

# update the mask
mask = cv2.morphologyEx(
mask, cv2.MORPH_DILATE, square_kernel, iterations=1
)
cv2.imshow("noise after dilate", imutils.resize(mask, width=600))
# cv2.imshow("origin - mask", imutils.resize(origin-mask, width=800))

origin-=mask
# origin = cv2.absdiff(origin, origin1)
# origin = cv2.bitwise_xor(origin, origin1)

cv2.imshow(f"results", imutils.resize(origin, width=600))

# Shuts down the display window and terminates
# the Python process when a specific key is
# pressed on the window.
# 27 is the esc key
# 113 is the letter 'q'
if key == 27 or key == 113:
break
cv2.destroyAllWindows()

Я пытался утолщать линии и вычитать их из изображения, но это не имело существенного значения, и выполнение нескольких итераций привело к появлению на изображении белых толстых линий. Приветствуются любые идеи о том, как это исправить.
# create a mask
mask = cv2.morphologyEx(
transformed_img, cv2.MORPH_OPEN, horizontal_kernel, iterations=1
)

cv2.imshow("noise after erode", imutils.resize(mask, width=600))

# update the mask
# using square kernel of 2x2 to thicken the lines
mask = cv2.morphologyEx(
mask, cv2.MORPH_DILATE, square_kernel, iterations=1
)
cv2.imshow("noise after dilate", imutils.resize(mask, width=600))

transformed_img -= mask


Подробнее здесь: https://stackoverflow.com/questions/786 ... of-a-table
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Python»