漫漫ocr之路(续)~列切分~

时间:2021-03-16 09:01:24

ocr之列切分

当得到每一行的图之后,需要进行列投影切分成单个字符,其实现大体如下:

1. 找出列间隔,根据列间隔的index进行分列

 gapVector = np.sum(binary, axis=0)
 realSegList = self.get_realSegList(gapVector, rowImg)

2. 对于列切分后得到的每块小图求h,w,scale:

for startIdx, endIdx in realSegList:
    img = rowImg[:, startIdx:endIdx]
    _w = img.shape[1]
    h, w, startY, startX_, img_ = self.getHW(img)  # 齐边切之后的
    scale = float(w) / float(h)

3. 根据scale进行判断:

3.1 去掉图片、竖线、横线

if (w > 0.9*rowImg.shape[1] and len(realSegList)!=1) or (w <= 2 * dpiMultiple and scale < 0.05) or (
                    h <= 2 * dpiMultiple and scale > 25) :  
    continue

3.2 如果宽高比过低且高度大于10,或高度过大,则判断是否有多行上下堆叠的情况

elif (scale < 0.5 and h > 10  * dpiMultiple) or h > 40 * dpiMultiple:  
    hVec, middleZeroFlag = self.gethVec(img)
    if not middleZeroFlag:  # 中间没有空白行,说明不是上下堆叠的情况,可能是竖线或者超大的图片,跳过
        if h > 30 * dpiMultiple:
            continue
        else:
            colList.append({'startX': startIdx+rowStartX, 'startY': startY, 'h': h, 'w': w,'img': img[startY:startY + h + 1, :]})

        else:  # 否则,可能是上下堆叠的情况,进一步判断
        [进一步判断]

然后构造列表gapList存放分割点:

3.2.1 没找到分割点,作为单字符加入到colList

3.2.2 找到分割点的分情况处理:

  1. 对scale<0.1的判断是不是上下两行的冒号没切开;
  2. 其余的,分别根据切分前后的scale判断每个找到的分割点是不是要切割,同时要添加条件,防止把本来不应该切割的冒号和分号或者上下结构的字切开。

    3.3 判断是否是scale超大的,多个字符没切开的,要resplitchar

elif scale > 1.2 and h > 11 * dpiMultiple:
    charList = self.splitChar(startIdx, img[startY:startY + h + 1, :],rowStartX, startY)
    if scale > 1.5:
        self.retry = 0
        charList = self.multiRowReSplitChar(charList,rowStartX)
    colList += charList

3.4 其余的scale的则认为hi正常的单字符,直接append

else:
    colList.append({'startX': startIdx+rowStartX, 'startY': startY, 'h': h, 'w': w, 'img': img[startY:startY + h + 1, :]})

小结

至此,列切分就完成了,得到了每一个字符,细节深入的东西还需要在实践中琢磨。