简单解决easyocr识别文字结果上下窜行问题

    科技2022-07-11  140

    上图中右侧的文字是easyocr对左侧图像直接识别得出的文字,很明显会上下窜行!!因为easyocr在切块识别的时候,同一行的横坐标切块也会不同,一般会相差一点点,但就是这一点点差别也足以在生成最终文字列表结果排序的时候造成上下窜行! 我尝试对easyocr识别的文字结果进行简单的数据清理和重新排序,主要是先给结果中横坐标值相差很少的文字的横坐标值清洗为同一个坐标值,然后将结果列表根据横坐标值排序,最后再将横坐标值相同的数据根据纵坐标值重新排序。发现对于横向排列的图片文字效果较好!如果文字是从左到右的块状排列则不好。当然,一般情况下文章还是行排列优先的,报纸等除外,呵呵。 具体做法如下: easyocr对图一左侧的图像识别出的原始文字列表结果如下: [([[8, 4], [213, 4], [213, 52], [8, 52]], ‘Python3教程’, 0.9741717576980591), ([ [550, 60], [866, 60], [866, 88], [550, 88]], ‘或简称 Py3ko相对于 Python 的早期版 本’, 0.11665570735931396), ([[212, 62], [542, 62], [542, 88], [212, 88]], ‘Pytho n 的3.0版本,常被称为 Python 3OO0’, 0.026935502886772156), ([[75.12517723237052, 65.88819831615469], [193.45487054353245, 50.729729434545966], [198.8748227676294 7, 94.11180168384531], [80.54512945646756, 108.27027056545403]], ‘python’, 0.858 8162660598755), ([[81, 95], [196, 95], [196, 137], [81, 137]], ‘powered’, 0.9674 362540245056), ([[212, 96], [558, 96], [558, 122], [212, 122]], ‘这是一个较大的 升级为了不带入过多的累螯’, 0.08532116562128067), ([[564, 96], [874, 96], [874, 1 22], [564, 122]], ‘Python 3.0在设计的时候没有考虑向下兼’, 0.13005395233631134), ([[213, 133], [235, 133], [235, 153], [213, 153]], ‘容’, 0.9591171145439148), ([ [12, 137], [119, 137], [119, 157], [12, 157]], ‘print("Hello,’, 0.80489748716354 37), ([[125, 139], [193, 139], [193, 155], [125, 155]], ‘world!")’, 0.4555930197 238922), ([[212, 163], [686, 163], [686, 188], [212, 188]], ‘Python 介绍及安装教 程我们在Python2X版本的教程中已有介绍’, 0.008101277984678745), ([[694, 164], [826 , 164], [826, 188], [694, 188]], ‘这里就不再鳌述’, 0.44630393385887146), ([[8, 1 98], [426, 198], [426, 222], [8, 222]], ‘你也可}击 Python2.x与3.x版本区别来查看 两者的不同’, 0.0017565927701070905), ([[8, 228], [306, 228], [306, 257], [8, 257 ]], ‘本教程主要针对 Python 3.x版本的学习’, 0.547705352306366), ([[314, 230], [79 2, 230], [792, 256], [314, 256]], ‘如果你使用的是 Python 2x版本请移步至 Python 2 .X版本的教程’, 0.10479342937469482), ([[8, 264], [82, 264], [82, 290], [8, 290]] , ‘裾方宣布’, 0.022012906149029732), ([[90, 266], [230, 266], [230, 290], [90, 2 90]], ‘2020年1月1日’, 0.5903170704841614), ([[242, 266], [420, 266], [420, 290], [242, 290]], ‘停止 Python2的更新’, 0.19329380989074707), ([[7, 315], [223, 315] , [223, 351], [7, 351]], ‘查看 Python 版本’, 0.12204223871231079), ([[8, 362], [ 734, 362], [734, 386], [8, 386]], ‘我|可以在命令窗O(windows 使用 win+R 调出 cmd 运行框)使用以下命令查看我们使用的 Python版本:’, 0.0001745351473800838)] 结果中包括文字的切块框坐标和识别出的文字等信息,我只根据切块的左上角坐标进行清洗和排序,代码如下(本人算法很弱,大家看看思路罢了):

    # codeing:utf-8 # by lzq2000 泉中流 # 20210217 import easyocr # 获取横坐标 def takeX(elem): return elem[0][0][1] # 获取纵坐标 def takeY(elem): return elem[0][0][0] # 获取两个数的差值 def takeMinus(elem1,elem2): return (abs(elem1-elem2)<3) #这里改了一下 # 如果x坐标相同,则根据y坐标排序列表 def sortByY(ilist): ilist.sort(key=takeY) return(ilist) reader = easyocr.Reader(['ch_sim','en']) result = reader.readtext(r'g:\testocr2.png') mylist=[] for x in result: mylist.append(list(x)) # 把元组转换为列表,为了方便进行排序 for i in range(len(mylist)): # 如果x坐标差距过小,则统一x坐标值 for j in range(i+1,len(mylist),1): if takeMinus(mylist[i][0][0][1],mylist[j][0][0][1]): mylist[j][0][0][1]=mylist[i][0][0][1] for i in range(len(mylist)): # 如果y坐标差距过小,则统一y坐标值 for j in range(i+1,len(mylist),1): if takeMinus(mylist[i][0][0][0],mylist[j][0][0][0]): mylist[j][0][0][0]=mylist[i][0][0][0] mylist.sort(key=takeX) # 先按照x坐标排序列表 resultlist=[] # 定义最终结果列表 # 拆分列表,将x坐标相同的分为一组 tmplist=[] tmpx=takeX(mylist[0]) # 取第一个元素的x坐标值 for z in mylist: if tmpx==takeX(z): tmplist.append(z) # 添加x坐标相同的元素到子列表中 else: tmplist=sortByY(tmplist) # 得到x坐标相同的子列表,立即根据y坐标排序 resultlist+=tmplist # 将排序后的子列表存入结果列表 tmplist=[] # 清空子列表 tmpx=takeX(z) # 更新x坐标值 tmplist.append(z) # 并存入子列表 tmplist=sortByY(tmplist) # 最后一组x坐标相同的子列表! resultlist+=tmplist for y in resultlist: print(y[1])

    其实我也清洗了纵坐标,当然不影响结果。 上图右侧的文字是我最后处理后的结果,简单解决了ocr识别文字结果上下窜行问题,希望能给大家带来一点点帮助!

    Processed: 0.008, SQL: 8