Удалить верхнюю часть изображения над границей, чтобы обнаружить текстовый документ - PullRequest
2 голосов
/ 01 февраля 2020

Использование OpenCV (python) Я пытаюсь удалить часть изображения, которая находится над границей (белая область в этом образце изображения, где ORIGINAL записывается) на изображении, показанном ниже Invoice Image

Используя горизонтальные и вертикальные ядра, я могу нарисовать каркас, но это не работает много раз, потому что много раз из-за качества сканирования несколько горизонтальных или вертикальных линий появляются вне каркаса, что вызывает неправильное определение контура. На этом изображении вы также можете видеть в правом верхнем углу шум, который я определяю как самую верхнюю горизонтальную линию.

Что я хочу, так это то, что когда я получу фактическое поле, я могу просто использовать координаты x, y для OCR. сканирование необходимых полей (например, ссылочный номер, выдан в et c).

Ниже приведено то, что я смог извлечь, используя приведенный ниже код. Однако не может обрезать внешний дополнительный участок изображения из-за шумных горизонтальных или вертикальных линий вне этого каркаса. Также попытался заполнить внешний раздел черным, а затем определить контуры.
Предложения, пожалуйста ... Wireframe

    kernel_length = np.array(image).shape[1]//40 
# A verticle kernel of (1 X kernel_length), which will detect all the verticle lines from the image.
verticle_kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (1, kernel_length))
# A horizontal kernel of (kernel_length X 1), which will help to detect all the horizontal line from the image.
hori_kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (kernel_length, 1))
# A kernel of (3 X 3) ones.
kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (3, 3))
# Morphological operation to detect verticle lines from an image
img_temp1 = cv2.erode(gray, verticle_kernel, iterations=3)
verticle_lines_img = cv2.dilate(img_temp1, verticle_kernel, iterations=3)

1 Ответ

0 голосов
/ 04 февраля 2020

Вместо того, чтобы пытаться найти горизонтальные / вертикальные линии для обнаружения текстового документа, здесь должен работать простой подход к фильтрации контуров. Идея состоит в том, чтобы пороговое изображение, чтобы получить двоичное изображение, а затем найти контуры и отсортировать с использованием области контура. Самый большой контур должен быть текстовым документом. Затем мы можем применить четырехточечное перспективное преобразование , чтобы получить изображение с высоты птичьего полета. Вот результаты:

Входное изображение:

image

Вывод:

image

Обратите внимание, как выводится изображение имеет только нужный текстовый документ и выровнен без перекоса.

Код

from imutils.perspective import four_point_transform
import cv2
import numpy

# Load image, grayscale, Gaussian blur, Otsu's threshold
image = cv2.imread("1.jpg")
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
blur = cv2.GaussianBlur(gray, (3,3), 0)
thresh = cv2.threshold(blur, 0, 255, cv2.THRESH_BINARY_INV + cv2.THRESH_OTSU)[1]

# Find contours and sort for largest contour
cnts = cv2.findContours(thresh, cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE)
cnts = cnts[0] if len(cnts) == 2 else cnts[1]
cnts = sorted(cnts, key=cv2.contourArea, reverse=True)
displayCnt = None

for c in cnts:
    # Perform contour approximation
    peri = cv2.arcLength(c, True)
    approx = cv2.approxPolyDP(c, 0.02 * peri, True)
    if len(approx) == 4:
        displayCnt = approx
        break

# Obtain birds' eye view of image
warped = four_point_transform(image, displayCnt.reshape(4, 2))

cv2.imshow("thresh", thresh)
cv2.imshow("warped", warped)
cv2.imshow("image", image)
cv2.waitKey()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...