python利用pytesseract 实现本地识别图片文字
#!/usr/bin/envpython3 #-*-coding:utf-8-*- importglob fromosimportpath importos importpytesseract fromPILimportImage fromqueueimportQueue importthreading importdatetime importcv2 defconvertimg(picfile,outdir): '''调整图片大小,对于过大的图片进行压缩 picfile:图片路径 outdir:图片输出路径 ''' img=Image.open(picfile) width,height=img.size while(width*height>4000000):#该数值压缩后的图片大约两百多k width=width//2 height=height//2 new_img=img.resize((width,height),Image.BILINEAR) new_img.save(path.join(outdir,os.path.basename(picfile))) defbaiduOCR(ts_queue): whilenotts_queue.empty(): picfile=ts_queue.get() filename=path.basename(picfile) outfile='D:\Study\pythonProject\scrapy\IpProxy\port_zidian.txt' img=cv2.imread(picfile,cv2.IMREAD_COLOR) print("正在识别图片:\t"+filename) message=pytesseract.image_to_string(img,lang='eng') message=message.replace('','') message=message.replace('\n','') #message=client.basicAccurate(img)#通用文字高精度识别,每天800次免费 #print("识别成功!")) try: filename1=filename.split('.')[0] filename1=''.join(filename1) withopen(outfile,'a+')asfo: fo.writelines('\''+filename1+'\''+':'+message+',') fo.writelines('\n') #fo.writelines("+"*60+'\n') #fo.writelines("识别图片:\t"+filename+"\n"*2) #fo.writelines("文本内容:\n") ##输出文本内容 #fortextinmessage.get('words_result'): #fo.writelines(text.get('words')+'\n') #fo.writelines('\n'*2) os.remove(filename) print("识别成功!") except: print('识别失败') print("文本导出成功!") print() defduqu_tupian(dir): ts_queue=Queue(10000) outdir=dir #ifpath.exists(outfile): #os.remove(outfile) ifnotpath.exists(outdir): os.mkdir(outdir) print("压缩过大的图片...") #首先对过大的图片进行压缩,以提高识别速度,将压缩的图片保存与临时文件夹中 try: forpicfileinglob.glob(r"D:\Study\pythonProject\scrapy\IpProxy\tmp\*"): convertimg(picfile,outdir) print("图片识别...") forpicfileinglob.glob("tmp1/*"): ts_queue.put(picfile) #baiduOCR(picfile,outfile) #os.remove(picfile) print('图片文本提取结束!文本输出结果位于文件中。') #os.removedirs(outdir) returnts_queue except: print('失败') if__name__=="__main__": start=datetime.datetime.now().replace(microsecond=0) t='tmp1' s=duqu_tupian(t) threads=[] try: foriinrange(100): t=threading.Thread(target=baiduOCR,name='th-'+str(i),kwargs={'ts_queue':s}) threads.append(t) fortinthreads: t.start() fortinthreads: t.join() end=datetime.datetime.now().replace(microsecond=0) print('删除耗时:'+str(end-start)) except: print('识别失败')
实测速度慢,但用了多线程明显提高了速度,但准确度稍低,同样高清图片,90百分识别率。还时不时出现乱码文字,乱空格,这里展现不了,自己实践吧,重点免费的,随便识别,通向100张图片,用时快6分钟了,速度慢了一倍,但是是免费的,挺不错的了。
以上就是python利用pytesseract实现本地识别图片文字的详细内容,更多关于python识别图片文字的资料请关注毛票票其它相关文章!