Вертикальная проекция и горизонтальная проекция - PullRequest
0 голосов
/ 18 декабря 2018

Я пытаюсь реализовать следующий алгоритм для ocr в этой статье.

https://arxiv.org/ftp/arxiv/papers/1707/1707.00800.pdf

Я запутался в этой части:

enter image description here

enter image description here

Я построил вертикальный профиль изображения:

env = np.sum(img, axis=1)

enter image description here

и вот что я получаю

enter image description here

Я ищу четкое объяснение алгоритма, возможно, спсевдокод

1 Ответ

0 голосов
/ 18 декабря 2018

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

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

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

Используя ваше изображение:

enter image description here

Красная линияявляется второй наиболее распространенной высотой, которую вам нужно найти (это можно сделать с помощью гистограммы).

Зеленые линии представляют разделение между отдельными символами (поэтому здесь вы получите 4 символа).

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

Псевдокод (или неподтвержденный непроверенный код):

# Discretize the y values to n_bins (noisier image will mean you can use less bins):
height_hist = np.histogram(y, bins=n_bins)

# Find bin with the second largest number of values:
bin = np.argsort(height_hist[0])[-2]

# Get the limit values of the bin:
y_low, y_high = height_hist[1][bin], height_hist[1][bin+1]

# Go over the vertical projection values and separate to characters:

zero = y[0] # Assuming the first projected value is outside of the word
char_list = []
i = 0
inside_char = False
while i < len(y):
    if y[i] != zero:
        start = i # start of char

        # Find end of current char:
        for j in range(i, len(y)):
            if y_low<=y[i] and  y[i]<=y_high:
                end = j # end of char
                char_list.append([start, end]) # add to char list
                i = end

        # Find the start of the next char:
        for j in range(i, len(y)):
            if y_low>y[i] or  y[i]>y_high:
                i = j
    else:
        i += 1
...