如何用python批量识别图片上的文字(一)
最近收到一個(gè)任務(wù),任務(wù)內(nèi)容如下:
指定一個(gè)目錄,內(nèi)含數(shù)千張圖片,要求能將指定區(qū)域的數(shù)字記錄下來,便于分析,圖片如下所示
紅框部分是需要識(shí)別出的區(qū)域
?先分析下功能需求
1.識(shí)別指定區(qū)域的數(shù)據(jù)
2.將數(shù)據(jù)導(dǎo)出為excel
這里有一個(gè)很簡(jiǎn)單的方法,就是使用easyocr識(shí)別整張圖片,然后檢索結(jié)果,整理成excel
識(shí)別代碼如下:
import easyocr reader = easyocr.Reader(['en']) result = reader.readtext("xx.bmp") #打印出所有識(shí)別到的文字 print(result)很簡(jiǎn)單的一段代碼,執(zhí)行完成后,就能將圖片上能識(shí)別到的文字都存到result上,
我們可以先打印出來,用人肉識(shí)別出需要識(shí)別的數(shù)據(jù)坐標(biāo)x,y是什么,之后寫if else將信息篩選出來
下面是執(zhí)行的結(jié)果
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]], '項(xiàng)目選擇', 0.004154475871473551), ([[534, 454], [618, 454], [618, 480], [534, 480]], '畫面保持', 0.7061346769332886)]?仔細(xì)查看數(shù)據(jù),可以發(fā)現(xiàn)我們要找的第一個(gè)框的數(shù)據(jù)信息如下
([[324, 96], [482, 96], [482, 150], [324, 150]], '236.42', 0.9945926786375755)
一個(gè)元組,有三個(gè)數(shù)據(jù),第一個(gè)數(shù)據(jù)是坐標(biāo)信息,第二個(gè)是識(shí)別到的字符串,第三個(gè)是識(shí)別的準(zhǔn)確率
4個(gè)坐標(biāo)分別代表了圖片的四個(gè)角
其它數(shù)據(jù)也是按這個(gè)邏輯找到,接下來,我們只需要寫一個(gè)for循環(huán),用if else將結(jié)果識(shí)別出來即可,下面是我項(xiàng)目的部分代碼,以作參考
def ocr_img(img):# 創(chuàng)建reader對(duì)象# 讀取圖像if not img.endswith("jpg"):returnresult = 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調(diào)用即可解決問題
最后會(huì)將識(shí)別到的結(jié)果以csv的格式存起來,可以用excel直接打開查看
這是第一版的程序,執(zhí)行一個(gè)命令行,將那幾千張圖片轉(zhuǎn)換成csv,任務(wù)完成
最終出來的數(shù)據(jù),雖然有一部分不是很完整,或者有些錯(cuò)亂,但總體來說還是好的,至少不用費(fèi)力一個(gè)個(gè)輸,只需要將出錯(cuò)的地方修復(fù)一下,能節(jié)省大量的錄入時(shí)間,perfect
第二版程序2.0,就做成了圖形化界面,可以針對(duì)不同的圖片進(jìn)行批量的識(shí)別,如下圖所示
之后再有類似的任務(wù),就是選擇目錄,點(diǎn)擊運(yùn)行,等個(gè)2小時(shí),就OK了
3000張圖片2小時(shí)識(shí)別完,性能還是差了點(diǎn),反正是掛機(jī)的,沒關(guān)系,
等哪天有空再寫個(gè)3.0吧?
總結(jié)
以上是生活随笔為你收集整理的如何用python批量识别图片上的文字(一)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: 为何要使用云端ERP系统
- 下一篇: Augmented Dickey–Ful
