文字识别tesseract--ORC(py版)

简介

一个常用的 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 中正则表达式的基本使用介绍:

  1. 导入 re 模块:首先,需要导入 re 模块,以便使用其中提供的函数和方法。
python复制代码import re
  1. 创建正则表达式对象:要使用正则表达式,需要创建一个正则表达式对象,可以使用 re.compile() 函数来编译正则表达式模式。
python复制代码pattern = re.compile(r'正则表达式模式')
  1. 匹配和搜索文本:使用正则表达式对象的 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)
  1. 使用匹配结果:根据匹配结果的需要,可以获取匹配的内容或位置等信息。
python复制代码if result:
    matched_text = result.group()  # 获取匹配到的文本
    start_position = result.start()  # 获取匹配开始的位置
    end_position = result.end()  # 获取匹配结束的位置
  1. 替换文本:使用 sub(pattern, repl, string) 方法可以将匹配到的文本替换为指定的内容。
python复制代码new_string = re.sub(pattern, replacement, string)
  1. 正则表达式模式语法:正则表达式模式由各种元字符、字符类、限定符和组合等构成。以下是一些常用的元字符和语法:
  • .:匹配任意单个字符,但不包括换行符。
  • *:匹配前面的字符零次或多次。
  • +:匹配前面的字符一次或多次。
  • ?:匹配前面的字符零次或一次。
  • []:定义一个字符类,匹配其中的任意一个字符。
  • \d:匹配任意一个数字字符。
  • \w:匹配任意一个字母、数字或下划线字符。
  • \s:匹配任意一个空白字符(空格、制表符等)。

这只是正则表达式的基础介绍,正则表达式还有更多功能和语法。您可以查阅 Python 官方文档中关于 re 模块的更详细信息,以及参考一些在线的正则表达式教程和工具来学习更多内容。

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值