Как обнаружить и увеличить расстояние между двумя строками в изображении текста с помощью opencv python? - PullRequest
3 голосов
/ 08 января 2020

enter image description here

Если исходное изображение выглядит так (см. Выше), тогда я могу успешно ввести пробел между двумя строками и получить это изображение (ниже) ) enter image description here

с использованием кода ниже:

import os
import cv2
def space_between_lines_and_skewness_correction(file_path):
    img = cv2.imread(os.path.expanduser(file_path))
    grey = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    th, threshed = cv2.threshold(grey, 0, 255, cv2.THRESH_BINARY_INV | cv2.THRESH_OTSU)
    pts = cv2.findNonZero(threshed)
    ret = cv2.minAreaRect(pts)
    (cx, cy), (w, h), ang = ret

    if w < h:
        w, h = h, w
        ang += 90
    M = cv2.getRotationMatrix2D((cx, cy), ang, 1.0)
    rotated = cv2.warpAffine(threshed, M, (img.shape[1], img.shape[0]))
    hist = cv2.reduce(rotated, 1, cv2.REDUCE_AVG).reshape(-1)
    th = 2
    H, W = img.shape[:2]
    delimeter = [y for y in range(H - 1) if hist[y] <= th < hist[y + 1]]
    arr = []
    y_prev = 0
    y_curr = 0
    for y in delimeter:
        y_prev = y_curr
        y_curr = y
        arr.append(rotated[y_prev:y_curr, 0:W])

    arr.append(rotated[y_curr:H, 0:W])
    space_arr = np.zeros((10, W))
    final_img = np.zeros((1, W))

    for im in arr:
        v = np.concatenate((space_arr, im), axis=0)
        final_img = np.concatenate((final_img, v), axis=0)
    return final_img

Приведенный выше код удалит асимметрию и освободит пробел. Но в некоторых случаях приведенный выше код не работает. Это такие случаи, как: enter image description here Выходные данные для изображения enter image description here

Как обрабатывать такие случаи, как этот?

Примечание: Я попытался изменить размер к большему размеру и сделать попиксельное итерирование и создать собственный алгоритм для этого случая, но это занимает огромное количество времени, чтобы решить и иногда дает ошибку памяти.

Пожалуйста, обратите внимание: ввод приведенного выше кода на самом деле является обратным изображением (белый фон) изображения, представленного здесь

1 Ответ

2 голосов
/ 08 января 2020

Может быть, это поможет:

def detect_letters(img):

    gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

    # just to remove noise
    thresh_val, thresh = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)

    num_labels, _, stats, centroids = cv2.connectedComponentsWithStats(thresh)

    for i in range(num_labels):
        leftmost_x = stats[i, cv2.CC_STAT_LEFT]
        topmost_y = stats[i, cv2.CC_STAT_TOP]
        width = stats[i, cv2.CC_STAT_WIDTH]
        height = stats[i, cv2.CC_STAT_HEIGHT]

        # enclose all detected components in a blue rectangle
        cv2.rectangle(img, (leftmost_x, topmost_y), (leftmost_x + width, topmost_y + height), (255, 0, 0), 2)

    cv2.imshow("window", img)
    cv2.waitKey(0) & 0xFF

Ввод: enter image description here

Ввод:

enter image description here

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

Теперь все, что вам нужно сделать, - это сдвинуть все эти буквы выше или ниже или куда угодно.

Например, посмотрите, как сместился футбольный мяч, по следующей ссылке: https://opencv-python-tutroals.readthedocs.io/en/latest/py_tutorials/py_core/py_basic_ops/py_basic_ops.html

Как вы знаете, верхнюю и нижнюю координаты y для каждой буквы сейчас , вы можете видеть, насколько далеко они в настоящее время находятся, и если они очень близки, просто сдвиньте букву, как в приведенной выше ссылке.

Буквы на одной линии будут иметь очень небольшую разницу в координатах своих вершин или центроидах. , Вы можете иметь диапазон допуска, чтобы выделить все эти буквы.

Если есть какие-либо вопросы, не стесняйтесь спрашивать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...