垂直投影和水平投影

时间:2018-12-18 08:10:30

标签: python computer-vision ocr

我正在尝试在该论文中为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 :(得分:1)

根据我的理解,该算法旨在分离单个阿拉伯字母,这些字母在书写时通过水平线连接(我对阿拉伯字母的了解完全为零)。

因此,该算法假定给定图像是水平对齐的(否则将不起作用),并且它正在寻找具有黑色像素上键相似的区域。

构造图像的垂直轮廓后,只需查找单词中最常见的高度(图像中第二高)。比起您,您只需要在特定高度的区域与其余区域之间分开图像即可。

使用图片:

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