这个问题其实是上一篇文章的遗留问题。
解决这个问题的方法次要有两个:1.进步图片的清晰度;2.升高辨认的错误率。
1.进步图片的清晰度
上一篇文章中用到的办法是从pdf中读取二进制之后,间接生成image,两头调整图片分辨率的参数。
这里采纳另外一种办法,能够进步图片的清晰度。
上代码:
if __name__ == '__main__': pdf = "*****医案选编.pdf" doc = fitz.open(pdf) pdf_name = os.path.splitext(pdf)[0] for pg in range(44,45): page = doc[pg] rotate = int(0) # 每个尺寸的缩放系数为10,这将为咱们生成分辨率进步100倍的图像。 # zoom_x, zoom_y = 10, 10 zoom_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函数加了一个参数,其实返回值类型都是一样的:
def ocr_baidu(filename, access_token, type="general_basic"): # encoding:utf-8 ''' 通用文字辨认 ''' if type == "general_basic": request_url = "https://aip.baidubce.com/rest/2.0/ocr/v1/general_basic" elif type == "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_token headers = {'content-type': 'application/x-www-form-urlencoded'} response = requests.post(request_url, data=params, headers=headers) if response: # print(response.json()) for words in response.json().get("words_result"): # # print(words.get("words")) print(words) return response.json().get("words_result") else: return None
这样下来,识别率进步很多,简直没有错别字了。不过申请的收费调用次数一个月都只有1000次,这一本pdf下来就用了近900次,看来得花钱了。费用来说,百度应该是最贵的,目前是49元5万次,还是首次的优惠价格。
失常价格是5万次1012元,哈哈,用不起啊。