提高图片ocr识别正确率

这个问题其实是上一篇文章的遗留问题。
解决这个问题的办法主要有两个:1.提高图片的清晰度;2.降低识别的错误率。
1.提高图片的清晰度
【提高图片ocr识别正确率】上一篇文章中用到的方法是从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识别技术文档:
提高图片ocr识别正确率
文章图片

点击API文档-》通用场景文字识别-》通用文字识别(高精度版)
提高图片ocr识别正确率
文章图片

找到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=https://www.it610.com/article/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万次,还是首次的优惠价格。
提高图片ocr识别正确率
文章图片

正常价格是5万次1012元,哈哈,用不起啊。

    推荐阅读