如何用python批量识别图片上的文字(一)

最近收到一个任务,任务内容如下:

指定一个目录,内含数千张图片,要求能将指定区域的数字记录下来,便于分析,图片如下所示

红框部分是需要识别出的区域

 先分析下功能需求

1.识别指定区域的数据

2.将数据导出为excel

这里有一个很简单的方法,就是使用easyocr识别整张图片,然后检索结果,整理成excel

识别代码如下:

import easyocr
reader = easyocr.Reader(['en'])
result = reader.readtext("xx.bmp")
#打印出所有识别到的文字
print(result)

很简单的一段代码,执行完成后,就能将图片上能识别到的文字都存到result上,

我们可以先打印出来,用人肉识别出需要识别的数据坐标x,y是什么,之后写if else将信息筛选出来

下面是执行的结果

apple@MacBook-Pro ocr % python3 ocr_img.py
CUDA not available - defaulting to CPU. Note: This module is much faster with a GPU.

[([[277, 0], [355, 0], [355, 19], [277, 19]], 'FC0RI1', 0.0014008946827395506), 
([[479, 0], [637, 0], [637, 19], [479, 19]], '2021-10-13,21:19:58', 
0.6067788830140517), 
([[5, 17], [57, 17], [57, 37], [5, 37]], 'CHI23:', 
0.4357974768811839), 
([[69, 17], [107, 17], [107, 37], [69, 37]], 'Ir8W', 、0.07446147501468658), ([[125, 17], [171, 17], [171, 37], [125, 37]], 'IOOO', 
0.34371185302734375), 
([[189, 17], [231, 17], [231, 37], [189, 37]], '5C8', 
0.01371344964992317), 
([[381, 17], [489, 17], [489, 37], [381, 37]], 'U:220 f: 
SOHZ', 0.25379714901679773), ([[545, 19], [567, 19], [567, 37], [545, 37]], '8', 
0.002208985491478424), 
([[585, 21], [635, 21], [635, 39], [585, 39]], '24days', 
0.36577745892357233), 
([[10, 34], [86, 34], [86, 60], [10, 60]], 'MONITOR', 
0.3407369661092041), 
([[108, 36], [146, 36], [146, 60], [108, 60]], '8/8', 
0.9650125824419508), 
([[236, 34], [289, 34], [289, 63], [236, 63]], '放', 
0.948400562849713), 
([[296, 36], [326, 36], [326, 60], [296, 60]], '大', 
0.8672227436346134), ([[521, 37], [567, 37], [567, 57], [521, 57]], '鸥ET', 
0.0012719364986274106), ([[6, 62], [214, 62], [214, 88], [6, 88]], 'Btart :10-
13_10:43:5', 0.11246014436800789), 
([[226, 63], [276, 63], [276, 89], [226, 89]], 
'Time:', 0.9575283801158503), 
([[294, 62], [442, 62], [442, 88], [294, 88]], 
'Odayg_10:36:@', 0.20593363300327408), 
([[25, 93], [135, 93], [135, 153], [25, 
153]], 'Urms', 0.9993236064910889), 
([[324, 96], [482, 96], [482, 150], [324, 
150]], '236.42', 0.9945926786375755), ([[28, 158], [132, 158], [132, 210], [28, 
210]], 'IrMS', 0.6551271080970764), ([[352, 156], [482, 156], [482, 212], [352, 212]], '1.734', 0.903081369161515), ([[528, 162], [552, 162], [552, 204], [528, 204]], 'A', 0.8598717599713979), ([[25, 214], [138, 214], [138, 275], [25, 275]], 'Freq', 0.9916050434112549), ([[324, 216], [482, 216], [482, 272], [324, 272]], '49.996', 0.9935817354482747), ([[523, 215], [585, 215], [585, 275], [523, 275]], 'Hz', 0.7322396318166535), ([[350, 276], [506, 276], [506, 332], [350, 332]], '0.229k', 0.8985150015324731), ([[526, 280], [558, 280], [558, 326], [526, 326]], '川', 0.04304330616733765), ([[21, 271], [86, 271], [86, 451], [21, 451]], '阼', 0.008450670474303479), ([[348, 336], [506, 336], [506, 392], [348, 392]], '0.410k', 0.9760298809799972), ([[526, 336], [582, 336], [582, 392], [526, 392]], 'VA', 0.985728575046812), ([[302, 396], [482, 396], [482, 452], [302, 452]], '-0.5576', 0.8452973534231776), ([[26, 454], [110, 454], [110, 480], [26, 480]], '画面选择', 0.22726230323314667), ([[152, 454], [236, 454], [236, 480], [152, 480]], '项目选择', 0.004154475871473551), ([[534, 454], [618, 454], [618, 480], [534, 480]], '画面保持', 0.7061346769332886)]

 仔细查看数据,可以发现我们要找的第一个框的数据信息如下

([[324, 96], [482, 96], [482, 150], [324, 150]], '236.42', 0.9945926786375755)

一个元组,有三个数据,第一个数据是坐标信息,第二个是识别到的字符串,第三个是识别的准确率

4个坐标分别代表了图片的四个角

其它数据也是按这个逻辑找到,接下来,我们只需要写一个for循环,用if else将结果识别出来即可,下面是我项目的部分代码,以作参考

def ocr_img(img):
    # 创建reader对象
    # 读取图像
    if not img.endswith("jpg"):
        return

    result = reader.readtext(img)
    print(result)
    print(len(result))
    line=[]
    for a in result:
        s=a[1];
        x=a[0][0][0]
        y=a[0][0][1]
        if x==479:
#            print("time:"+s)
            line.append(s)
        if x>=300 and x<=356 and y>=90 and y<=100:
#            print("Urms:"+s)
            line.append(s)
        if x>=300 and x<=356 and y>=145 and y<=160:
#            print("Irms:"+s)
            line.append(s)
        if x>=300 and x<=356 and y>=200 and y<=220:
#            print("Freq:"+s)
            line.append(s)
        if x>=300 and x<=356 and y>=270 and y<=280:
#            print("P:"+s)
            line.append(s)
        if x>=300 and x<=356 and y>=330 and y<=340:
#            print("S:"+s)
            line.append(s)
        if x>=300 and x<=356 and y>=390 and y<=400:
#            print("PF:"+s)
            line.append(s)
    if len(line)==7:
        print(line)
        if not os.path.exists("result/"+img+".result"):
            s=""
            for i in range(0,len(line)):
                s+=line[i]+","
            open("result/"+img+".result","w").write(s)
    else:
        print("error:"+img,line)
        for a in result:
            print(a)

有多张图片的话,直接for调用即可解决问题

最后会将识别到的结果以csv的格式存起来,可以用excel直接打开查看

这是第一版的程序,执行一个命令行,将那几千张图片转换成csv,任务完成

最终出来的数据,虽然有一部分不是很完整,或者有些错乱,但总体来说还是好的,至少不用费力一个个输,只需要将出错的地方修复一下,能节省大量的录入时间,perfect

第二版程序2.0,就做成了图形化界面,可以针对不同的图片进行批量的识别,如下图所示

之后再有类似的任务,就是选择目录,点击运行,等个2小时,就OK了

3000张图片2小时识别完,性能还是差了点,反正是挂机的,没关系,

等哪天有空再写个3.0吧 

猜你喜欢

转载自blog.csdn.net/kof98765/article/details/125671794