简介
一个常用的 Python 库用于识别图片中的文字是 Tesseract。Tesseract 是一个免费的开源 OCR(Optical Character Recognition)引擎,可以识别多种语言的文本。
1. 下载安装
下载地址:Index of /tesseract
选择最新的版本进行下载,下载完成后,解压安装在自己设定的安装路径,一直选择next即可完成安装。
2. 添加环境变量
在win10为例,
(1)在高级设置的环境变量中设置Path路径
(2)添加新的变量名:TESSDATA_PREFIX,添加以下数据,添加语言包的路径
F:\Tesseract-OCR\tessdata
3. 测试安装和语言包
打开命令提示符,查看版本信息,输入
tesseract -v
查看语言包
tesseract --list-langs
4. 安装库
pip install pytesseract
pip install Pillow
pytesseract提供文字识别
Pillow提供打开图片,截图,图片处理
5. 图片预处理
为了提高图片的识别率, 需要对图片进行预处理。
(1)截取识别区。
这一步是为了缩小识别的范围,减少不必要的文字干扰。
代码:
#截图函数
def cropped_images():
image = Image.open(file)
# 获取图像的宽度和高度
width, height = image.size
# 设置截取区域的左下角和右上角坐标
left = 0
top = height - int(height*0.25) # 截取区域的高度为 300 像素
right = int(width*0.6) # 截取区域的宽度为 400 像素
bottom = height
# 根据截取区域坐标进行截图
cropped_image = image.crop((left, top, right, bottom))
# 保存截图后的图像
cropped_image.save(cropped_image_path)
print("截图好了")
image.close
(2)图片灰化,二度化
减少背景中的物体和光线亮度对图片的文字的影响,使图片的文字更加清晰。
代码:
# 建议图像识别前,先对图像进行灰度化和 二值化,以提高文本识别率
def image_conert_point():
image = Image.open(cropped_image_path)
# image = Image.open(image)
Img = image.convert('L') # 灰度化
#自定义灰度界限,这里可以大于这个值为黑色,小于这个值为白色。threshold可根据实际情况进行调整(最大可为255)。
threshold = 180
table = []
for i in range(256):
if i < threshold:
table.append(0)
else:
table.append(1)
photo = Img.point(table, '1') #图片二值化
#保存处理好的图片
photo.save(cropped_image_path)
print("图像进行灰度化和二值化成功!!")
image.close
6. 文字识别
# 使用 pytesseract 进行文字识别
def tesseract():
image = Image.open(cropped_image_path)
text = pytesseract.image_to_string(image,lang='chi_sim')
# 输出识别的文字
print("图片中的文字内容:")
print(text)
matchtext(text)
7. 提取文字
正则表达式
#提取关键字 正则表达式
# 提取地点中的公司名字:匹配以 "地点:" 开头,后面跟着地点名称的字符串,并去除空格和特殊字符
def matchtext(text):
pattern = r'地[ ].*?\s+(.*?)\s+'
match = re.search(pattern, text)
print("正则提取:",match)
company_name = re.sub(r"[^\w\s]", "", match.group(1)) if match else None
# 输出提取到的公司名字
if company_name :
print("公司名字:", company_name)
else:
print("提取失败!!")
pattern:匹配模式
text:匹配文本
去特殊符号和空格
re.sub(r"[^\w\s]", "", match.group(1))
8. 完整代码
import pytesseract
from PIL import Image
import re
# pytesseract.pytesseract.tesseract_cmd = r'F:\Tesseract-OCR\tesseract.exe'
# 打开图片
file = "C:/Users/xwl/Desktop/py测试/test8.jpg"
cropped_image_path= "C:/Users/xwl/Desktop/py测试/crp/test1.jpg"
#截图函数
def cropped_images():
image = Image.open(file)
# 获取图像的宽度和高度
width, height = image.size
# 设置截取区域的左下角和右上角坐标
left = 0
top = height - int(height*0.25) # 截取区域的高度为 300 像素
right = int(width*0.6) # 截取区域的宽度为 400 像素
bottom = height
# 根据截取区域坐标进行截图
cropped_image = image.crop((left, top, right, bottom))
# 保存截图后的图像
cropped_image.save(cropped_image_path)
print("截图好了")
image.close
# 建议图像识别前,先对图像进行灰度化和 二值化,以提高文本识别率
def image_conert_point():
image = Image.open(cropped_image_path)
# image = Image.open(image)
Img = image.convert('L') # 灰度化
#自定义灰度界限,这里可以大于这个值为黑色,小于这个值为白色。threshold可根据实际情况进行调整(最大可为255)。
threshold = 180
table = []
for i in range(256):
if i < threshold:
table.append(0)
else:
table.append(1)
photo = Img.point(table, '1') #图片二值化
#保存处理好的图片
photo.save(cropped_image_path)
print("图像进行灰度化和二值化成功!!")
image.close
# 使用 pytesseract 进行文字识别
def tesseract():
image = Image.open(cropped_image_path)
text = pytesseract.image_to_string(image,lang='chi_sim')
# 输出识别的文字
print("图片中的文字内容:")
print(text)
matchtext(text)
#提取关键字 正则表达式
# 提取地点中的公司名字:匹配以 "地点:" 开头,后面跟着地点名称的字符串,并去除空格和特殊字符
def matchtext(text):
pattern = r'地[ ].*?\s+(.*?)\s+'
match = re.search(pattern, text)
print("正则提取:",match)
company_name = re.sub(r"[^\w\s]", "", match.group(1)) if match else None
# 输出提取到的公司名字
if company_name :
print("公司名字:", company_name)
else:
print("提取失败!!")
# 图片路径
# image_path = "C:/Users/xwl/Desktop/py测试/test1.jpg"
def autorunning():
# 截图
cropped_images()
# 图片灰度化和二值化预处理
image_conert_point()
#tesseract orc 识别处理
tesseract()
autorunning()
9. 扩展--正则表达式
正则表达式(Regular Expression)是一种强大的模式匹配工具,用于在字符串中搜索、匹配和替换文本。Python 提供了 re 模块来支持正则表达式的使用。
下面是 Python 中正则表达式的基本使用介绍:
- 导入 re 模块:首先,需要导入 re 模块,以便使用其中提供的函数和方法。
python复制代码import re
- 创建正则表达式对象:要使用正则表达式,需要创建一个正则表达式对象,可以使用 re.compile() 函数来编译正则表达式模式。
python复制代码pattern = re.compile(r'正则表达式模式')
- 匹配和搜索文本:使用正则表达式对象的 match()、search() 或 findall() 方法来匹配和搜索文本。
- match(pattern, string):从字符串的开头开始匹配模式。
- search(pattern, string):在字符串中搜索并返回第一个匹配的结果。
- findall(pattern, string):搜索并返回所有匹配的结果。
python复制代码result = pattern.match(string)
result = pattern.search(string)
results = pattern.findall(string)
- 使用匹配结果:根据匹配结果的需要,可以获取匹配的内容或位置等信息。
python复制代码if result:
matched_text = result.group() # 获取匹配到的文本
start_position = result.start() # 获取匹配开始的位置
end_position = result.end() # 获取匹配结束的位置
- 替换文本:使用 sub(pattern, repl, string) 方法可以将匹配到的文本替换为指定的内容。
python复制代码new_string = re.sub(pattern, replacement, string)
- 正则表达式模式语法:正则表达式模式由各种元字符、字符类、限定符和组合等构成。以下是一些常用的元字符和语法:
- .:匹配任意单个字符,但不包括换行符。
- *:匹配前面的字符零次或多次。
- +:匹配前面的字符一次或多次。
- ?:匹配前面的字符零次或一次。
- []:定义一个字符类,匹配其中的任意一个字符。
- \d:匹配任意一个数字字符。
- \w:匹配任意一个字母、数字或下划线字符。
- \s:匹配任意一个空白字符(空格、制表符等)。
这只是正则表达式的基础介绍,正则表达式还有更多功能和语法。您可以查阅 Python 官方文档中关于 re 模块的更详细信息,以及参考一些在线的正则表达式教程和工具来学习更多内容。