Исходное изображение содержит таблицы, над которыми я выполнил эрозию/расширение, используя горизонтальное и вертикальное ядро для поиска/обнаружения горизонтальных и вертикальных линий. Затем я использовал функции 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
Как убрать ломаные горизонтальные линии из сканированного изображения таблицы ⇐ Python
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение
-
-
Как рисовать горизонтальные линии с помощьюchart.js 3.x? Не могу заставить его работать
Anonymous » » в форуме Jquery - 0 Ответы
- 14 Просмотры
-
Последнее сообщение Anonymous
-