Почему меняются координаты вертикальной линии? - PullRequest
1 голос
/ 07 мая 2020

Я пытаюсь извлечь текст из таблиц с помощью openCV и Azure read. Цель состоит в том, чтобы извлечь текстовый столбец разумно. Итак, первым делом необходимо определить вертикальные линии на изображении (таблице). Теперь, используя координаты этих вертикальных линий в качестве крайних границ, мы идентифицируем текст между этими линиями.

Таким образом получается текст на основе фильтра вертикальной линии.

Хотя скрипт работает нормально, я наблюдал сценарий, в котором координаты строки встречаются неправильно для одного конкретного типа (Тип A) таблиц. Итак, после отладки мы заметили, что проблема связана с заголовком таблиц (только для типа A).

Итак, когда мы удалили (обрезали изображение) часть заголовка таблиц (типа A), координаты вертикальной линии стали подходящими.

Форматирование координат как (x, y, w, h). x и y - самая верхняя точка вертикальной линии. w - ширина линии. (по вертикали это максимум почти 2 пикселя). h - высота вертикальной линии.

Здесь я прикрепляю два сценария ios: 1. Таблица с заголовками - с неправильными координатами. Фактическое изображение , Бинаризованные вертикальные линии фактического изображения

координаты вертикальных линий с заголовками (слева направо) - [(9, 0, 14, 439), (213, 0, 93, 426), (337, 28, 1, 398), (397, 29, 1, 410), (470, 29, 1, 397), (522, 0, 12, 439)]

Таблица без заголовков - с указанием соответствующих координат. Изображение без заголовков , Без заголовков

координаты вертикальных линий без заголовков (слева направо) - [(7, 0, 1, 404), (303, 0, 1, 391), (335, 0, 1, 391), (395, 0, 1, 404), (468, 0, 1, 391), (531, 0, 1, 404)]

Мы можем наблюдать, как координаты второй линии сильно различаются, в то время как другие линии близки. Итак, проблема в том, что координаты второй вертикальной линии на изображении с заголовками неверны. Что может быть причиной?

1 Ответ

0 голосов
/ 07 мая 2020

Это может быть из-за установленного порогового значения для фильтрации вертикальных линий. Results

import numpy as np
import sys
import cv2 as cv

def show_wait_destroy(winname, img):
    cv.imshow(winname, img)
    cv.moveWindow(winname, 500, 0)
    cv.waitKey(0)
    cv.destroyWindow(winname)

def main(argv):
    # [load_image]
    # Check number of arguments
    if len(argv) < 1:
        print ('Not enough parameters')
        print ('Usage:\nmorph_lines_detection.py < path_to_image >')
        return -1
    # Load the image
    src = cv.imread(argv[0], cv.IMREAD_COLOR)
    # Check if image is loaded fine
    if src is None:
        print ('Error opening image: ' + argv[0])
        return -1
    # Show source image
    cv.imshow("src", src)
    # [load_image]
    # [gray]
    # Transform source image to gray if it is not already
    if len(src.shape) != 2:
        gray = cv.cvtColor(src, cv.COLOR_BGR2GRAY)
    else:
        gray = src
    # Show gray image
    show_wait_destroy("gray", gray)
    # [gray]
    # [bin]
    # Apply adaptiveThreshold at the bitwise_not of gray, notice the ~ symbol
    gray = cv.bitwise_not(gray)
    bw = cv.adaptiveThreshold(gray, 255, cv.ADAPTIVE_THRESH_MEAN_C, \
                                cv.THRESH_BINARY, 15, -2)
    # Show binary image
    show_wait_destroy("binary", bw)
    # [bin]
    # [init]
    # Create the images that will use to extract the horizontal and vertical lines
    horizontal = np.copy(bw)
    vertical = np.copy(bw)
    # [init]
    # [horiz]
    # Specify size on horizontal axis
    cols = horizontal.shape[1]
    horizontal_size = cols // 30
    # Create structure element for extracting horizontal lines through morphology operations
    horizontalStructure = cv.getStructuringElement(cv.MORPH_RECT, (horizontal_size, 1))
    # Apply morphology operations
    horizontal = cv.erode(horizontal, horizontalStructure)
    horizontal = cv.dilate(horizontal, horizontalStructure)
    # Show extracted horizontal lines
    show_wait_destroy("horizontal", horizontal)
    # [horiz]
    # [vert]
    # Specify size on vertical axis
    rows = vertical.shape[0]
    verticalsize = rows // 10 #####--->>>>>This decides the threshold for vertical line
    # Create structure element for extracting vertical lines through morphology operations
    verticalStructure = cv.getStructuringElement(cv.MORPH_RECT, (1, verticalsize))
    # Apply morphology operations
    vertical = cv.erode(vertical, verticalStructure)
    vertical = cv.dilate(vertical, verticalStructure)
    # Show extracted vertical lines
    show_wait_destroy("vertical", vertical)
    # [vert]
    # [smooth]
    # Inverse vertical image
    vertical = cv.bitwise_not(vertical)
    show_wait_destroy("vertical_bit", vertical)
    '''
    Extract edges and smooth image according to the logic
    1. extract edges
    2. dilate(edges)
    3. src.copyTo(smooth)
    4. blur smooth img
    5. smooth.copyTo(src, edges)
    '''
    # Step 1
    edges = cv.adaptiveThreshold(vertical, 255, cv.ADAPTIVE_THRESH_MEAN_C, \
                                cv.THRESH_BINARY, 3, -2)
    show_wait_destroy("edges", edges)
    # Step 2
    kernel = np.ones((2, 2), np.uint8)
    edges = cv.dilate(edges, kernel)
    show_wait_destroy("dilate", edges)
    # Step 3
    smooth = np.copy(vertical)
    # Step 4
    smooth = cv.blur(smooth, (2, 2))
    # Step 5[![enter image description here][1]][1]
    (rows, cols) = np.where(edges != 0)
    vertical[rows, cols] = smooth[rows, cols]
    # Show final result
    show_wait_destroy("smooth - final", vertical)
    # [smooth]
    return 0
if __name__ == "__main__":
    main(sys.argv[1:])
    ####to run the script use >>>>python image.py path/to/image
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...