OCR文字检测框的合并
项目的github地址:https://github.com/zcswdt/merge_text_boxs
在我们使用文字检测模型的对文本进行检测的时候,可能效果不能如愿以偿,如:某行文本会存在着多个检测框,这对于我们后续做OCR识别过程中语义连贯带来一系列的困扰,本文主要是解决针对文字检测得到的文字框,进行合并。
1.如下是一张原始图片:

2.使用常见的文字检测模型(craft,DBNet,PSENet)对该图片进行文字检测得到的效果如下:

- 使用如下代码对文字框进行x轴上的合并,得到的效果如下:

import numpy as np
def get_rect_points(text_boxes):
x1 = np.min(text_boxes[:, 0])
y1 = np.min(text_boxes[:, 1])
x2 = np.max(text_boxes[:, 2])
y2 = np.max(text_boxes[:, 3])
return [x1, y1, x2, y2]
class BoxesConnector(object):
def __init__(self, rects, imageW, max_dist=None, overlap_threshold=None):
print('max_dist',max_dist)
print('overlap_threshold',overlap_threshold )
self.rects = np.array(rects)
self.imageW = imageW
self.max_dist = max_dist # x轴方向上合并框阈值
self.overlap_threshold = overlap_threshold # y轴方向上最大重合度
self.graph = np.zeros((self.rects.shape[0], self.rects.shape[0])) # 构建一个N*N的图 N等于rects的数量
self.r_index = [[] for _ in range(imageW)] # 构建imageW个空列表
for index, rect in enumerate(rects): # r_index第rect[0]个元素表示 第index个(数量可以是0/1/大于1)rect的x轴起始坐标等于rect[0]
if int(rect[0]) < imageW:
self.r_index[int(rect[0])].append(index)
else: # 边缘的框旋转后可能坐标越界
self.r_index[imageW - 1].append(index)
print(self.r_index)
def calc_overlap_for_Yaxis(self, index1, index2):
# 计算两个框在Y轴方向的重合度(Y轴错位程度)
height1 = self.rects[index1][3] - self.rects[index1][1]
height2 = self.rects[index2][3] - self.rects[index2][1]
y0 = max(self.rects[index1][1], self.rects[index2][1])
y1 = min(self.rects[index1][3], self.rects[index2][3])
print('y1', y1)
Yaxis_overlap = max(0, y1 - y0) / max(height1, height2)
print('Yaxis_overlap', Yaxis_overlap)
return Yaxis_overlap
def get_proposal(self, index):
rect = self.rects[index]
print('rect',rect)
for left in range(rect[0] + 1, min(self.imageW - 1, rect[2] + self.max_dist)):
#print('left',left)
for idx in self.r_index[left]:
print('58796402',idx)
# index: 第index个rect(被比较rect)
# idx: 第idx个rect的x轴起始坐标

本文介绍了一种针对OCR文字检测框的合并方法,通过在x轴和区域上合并文字框,解决了多检测框带来的语义连贯性问题,提高了OCR识别的准确性。
最低0.47元/天 解锁文章
2062

被折叠的 条评论
为什么被折叠?



