OCR识别图片和PDF上的文字

为了提高识别率,先用opencv-python对扫描的图片做预处理(减少背景杂音),然后调用pytesseract识别图片上的文字。处理方式就是:

1、将图片的颜色模式转成灰度模式,再用OTSU做二值化处理

2、将处理结果保存成临时图片文件

3、调用pytesseract识别临时图片上的文字,识别完毕后删掉临时图片

选择要识别文字的图片调用tkinter打开图形化对话窗口,tkinter是python内置模块,可直接引进不必安装。对tkinter不做太多解释,只是借助它的功能函数打开对话窗口。引入内置os的功能函数删除临时文件。

from PIL import Image           # pytesseract识别图片上的文字时要用
import pytesseract	        # 识别图片上的文字
import cv2			# 图片预处理,减少背景杂音
import os			# 删除临时文件
from tkinter import Tk	        # 帮忙用图形化界面找到要识别的图片文件
from tkinter.filedialog import askopenfilename

Tk().withdraw()                 # 这里不是要全部图形化界面,所以就不显示根窗口了
imgName = askopenfilename() # 显示“打开”窗口,返回选中的图片文件的路径+文件名字符串

# 预处理图片
greyImg = cv2.imread(imgName, 0)	
# 预处理第一步,彩色模式转成灰度模式:以灰度模式打开图片,生成灰度图片
greyImg = cv2.threshold(greyImg, 0, 255,cv2.THRESH_BINARY | cv2.THRESH_OTSU)[1]
# 预处理第二步,OTSU二值法,返回的是列表,第二个元素(索引为1)指向被处理的图片

# 将预处理结果保存成临时文件,文件名用它在系统的进程ID(os.getpid())
filename = "{}.png".format(os.getpid())
cv2.imwrite(filename, greyImg)

# 调用pytesseract将图片上的文字识别出来
txt = pytesseract.image_to_string(Image.open(filename))

os.remove(filename)	        # 删除临时图片文件

with open("toFile.txt", 'w', encoding='utf-8') as fObject:
    fObject.write(txt)	        # 将识别出来的字符串保存到文本文件

提高图片文字的识别率和正确率是个大话题,跟图片上文字的背景有关系,跟图片分辨率有关系,跟识别用的字库的识别能力也有关系(字库可以训练),牵扯的技术手段很多。除了减少背景杂音外,还有一些预处理工作我们也可以做,比如把图片上有文字的部分截取下来识别(效果很明显);把图片上的文字分成一小段一小段识别,甚至分成一个一个字符来识别……有兴趣的朋友可以自己研究。