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 找到分割点的分情况处理:
- 对scale<0.1的判断是不是上下两行的冒号没切开;
-
其余的,分别根据切分前后的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, :]})
小结
至此,列切分就完成了,得到了每一个字符,细节深入的东西还需要在实践中琢磨。