当前位置: 首页 > 后端技术 > Python

提高图片ocr识别正确率的问题

时间:2023-03-26 13:39:38 Python

其实是上一篇文章的遗留问题。解决这个问题主要有两种方法:1、提高画面的清晰度;2.降低识别错误率。1.提高图片的清晰度上一篇文章使用的方法是直接从pdf读取二进制后生成图片,中间调整图片分辨率的参数。这里使用另一种方法来提高画面的清晰度。上面的代码:if__name__=='__main__':pdf="*****MedicalCasesSelection.pdf"doc=fitz.open(pdf)pdf_name=os.path.splitext(pdf)[0]forpginrange(44,45):page=doc[pg]rotate=int(0)#每个尺寸的比例因子为10,这将为我们生成分辨率提高100倍的图像。#zoom_x,zoom_y=10,10zoom_x,zoom_y=2,2#经过测试,2*2的识别率最高。trans=fitz.Matrix(zoom_x,zoom_y).preRotate(rotate)pm=page.getPixmap(matrix=trans,alpha=False)pm.writePNG('%s.png'%pdf_name)2.通过降低错误识别率以上步骤,可以得到比原来更清晰的图片。但实际上,提升还是比较有限。快要放弃的时候,我用QQ截图识别了一下,果然比我调用的API好太多了。想不通,技术上的区别也没那么大。后来翻了翻腾讯的身份识别服务的技术文档,才恍然大悟问题出在哪里。我调用的百度识别服务是标准版(general_basic)。当时没注意,后来又查了下文档,识别率只有91%左右。于是,我用百度的高精版(accurate_basic)api调用试了一下,几乎没有错别字。不过这里不得不说,百度的api文档没有腾讯的方便。打开百度高精版(accurate_basic)ocr识别技术文档:点击API文档-》通用场景文字识别-》通用文字识别(高精版)找到这段Python示例代码,红框内的参数为高精度版本。上面的代码在上一篇的ocr_baidu函数中添加了一个参数,但是返回值类型其实是一样的:defocr_baidu(filename,access_token,type="general_basic"):#encoding:utf-8'''一般文本识别'''iftype=="general_basic":request_url="https://aip.baidubce.com/rest/2.0/ocr/v1/general_basic"eliftype=="accurate_basic":request_url="https://aip.baidubce.com/rest/2.0/ocr/v1/accurate_basic"#以二进制方式打开图像文件f=open(filename,'rb')img=base64.b64encode(f.read())params={"image":img}#access_token='[调用认证接口获取的token]'request_url=request_url+"?access_token="+access_tokenheaders={'content-type':'application/x-www-form-urlencoded'}response=requests.post(request_url,data=params,headers=headers)ifresponse:#print(response.json())forwordsinresponse.json().get("words_result"):##打印(words.get("words"))print(words)returnresponse.json().get("words_result")否则:返回否这样识别率就大大提高了,几乎没有错别字。但是,该应用程序的免费通话次数每月只有1000次。这个pdf已经用了将近900次了,看来要花钱了。从成本上来说,百度应该是最贵的。目前49元5万次,首发优惠价。正常价5万次1012元,哈哈,买不起。