Насколько я понимаю, этот алгоритм предназначен для разделения отдельных арабских букв, которые при написании связаны между собой горизонтальной линией (у меня точно нулевое знание арабских букв).
Таким образом, алгоритм предполагает, что данныйизображение выровнено по горизонтали (иначе оно не будет работать), и оно ищет области с похожими верхними связями черных пикселей.
После того, как вы построили вертикальный профиль изображения, вам просто нужно найтисамая распространенная высота в слове (вторая по величине в изображении).Чем вы просто разделяете изображение между областями этой конкретной высоты и остальных.
Используя ваше изображение:
Красная линияявляется второй наиболее распространенной высотой, которую вам нужно найти (это можно сделать с помощью гистограммы).
Зеленые линии представляют разделение между отдельными символами (поэтому здесь вы получите 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