如何替换数组的多个连续部分?

问题描述

所以问题围绕字符分割。我的问题如下:

我想根据 y 轴像素数分割字符,如下(在 python 中):source

为了到达这里我已经做了什么:

  • 阅读图片io.imread
  • 交换轴np.swapaxes
  • 对每列(现在是行)的数字求和 - > 得到 y 数组

我已经到了有两个数组的地步(它们都是我使用的);

x = [94,72,2,1,66,13,16,8,5,47,3,17,14,87,100]
y = [0,0]

y 是 y 轴的阈值二进制数组,(如果像素数

x 是 y 数组的 itertools groupby 版本。

我也有字母的平均距离,所以我知道哪些是错误分割的部分。 (根据 x,平均值为 28。)

这是我要分割的图像,它有 4 个字母,“a”、“l”、“m”、“a”:

picture which i would like to segment

所以理论上,如果我能以某种方式合并 1 的数量低于平均值的部分,并将“分隔”零变为 1,我应该得到一个与宽度一样长的列表图像,并且只在它应该有的地方有零。

如果我在 y 数组上使用 cv.line,它确实会分割字符,在数组为 0 的地方画一条红线,但它过度分割了。

oversegmented image

我想做的是“修改”或者只是重新做基于 x 的 y 数组。

我尝试了很多方法,但我就是找不到算法来遍历 x,找到错误的值,删除间的零,并据此修改列表。

我最好的镜头就是这么简单,完全不像我的原创想法:

num = 0
betterarray = []
for i in range(len(y)):
  if( num == 1 and y[i] == 0 and y[i+1] == 1):
    betterarray.append(1)
  else :
    betterarray.append(y[i])
  num = y[i]

它确实删除了(大多数情况下)一列只有坏的分段,但正如我猜想的那样,它也删除了一些好的分段。

解决方法

您应该通过将您的段与峰值段平均值进行比较并通过组合任何小于平均值的峰值段来修改 x 数组来识别错误分割的字母。

def locate_oversegmentation(array,mask,avg):
    length = len(array)

    for i in range(length):
        // less than average peak
        if (mask[i]==1 and array[i]<=avg):
            if (i-2>=0):
                // previous peak is less than avg
                if (array[i-2]<=avg):
                    mask[i-1] = 1
            if (i+2<=length):
                // next peak is less than avg
                if (array[i+2]<=avg):
                    mask[i+1] = 1
    return mask

这个函数通过对连续的 0 和 1 进行分组来接收数组 x 和数组 y 的紧凑版本。 compact_y = [0,1,0] 它将返回一个新数组,将低于平均峰值之间的 0 更改为 1。输出数组是组合数组 x 中峰值的指南。

示例:

x = [94,72,2,66,13,16,8,5,47,3,17,14,87,100]
compact_y = [0,0]
avg = 28
guide = locate_oversegmentation(x,compact_y,avg)

>> guide = [0,0]

通过在数组 x 中将连续的 1 相加,将指南应用于数组 x。