20232111 2023-2024-2 《Python程序设计》实验四报告

20232111段宇轩 2024-05-28 23:25:06

课程:《Python程序设计》
班级: 2321
姓名: 段宇轩
学号:20232111
实验教师:王志强
实验日期:2024年5月15日
必修/选修: 公选课

实验内容

Python综合应用:爬虫、数据处理、可视化、机器学习、神经网络、游戏、网络安全等。

利用Python库,基于OCR技术实现自动化提取图片中数据,并填入excel中。

在Windows/Linux系统上使用VIM、PDB、IDLE、Pycharm等工具编程实现。

实验过程

用OCR第三方库以开源免费的easyocr来完成实验。

  • 安装模块
pip install easyocr   
  • 导入所需库
import cnocr
from PIL import Image
from openpyxl import Workbook
  • 识别一张图片:

1.创建一个easyocr.Reader类对象,指定以下两个常用参数:
需要识别的文字属于哪几种语言
是否启用GPU显卡加速.
2.调用Reader对象的readtext方法,将图片中所有文字读入一个列表并返回。

import easyocr
image = './id_card/1.jpg'
ocr = easyocr.Reader(['ch_sim', 'en'],gpu=False)
content = ocr.readtext(image)
print(content)

导入easyocr模块。easyocr是一个开源的光学字符识别(OCR)库,它能够识别图像中的文字。通过导入这个库,可以使用它来识别图片中的文本内容。
定义一个变量image,并将其设置为字符串'./id_card/1.jpg',这个字符串表示图片文件的路径,它指向当前工作目录下的id_card文件夹中的一个名为1.jpg的图片文件。这个图片文件将用于后续的OCR识别。
创建了一个easyocr.Reader对象,并将其赋值给变量ocr。easyocr.Reader的构造函数接受一个语言列表和一个可选的gpu参数。指定了要识别的语言是中文简体(ch_sim)和英文(en)。gpu=False表示不使用GPU进行加速处理,而是使用CPU,为了简化环境配置。
使用前面创建的ocr对象的readtext方法来识别指定路径的图片中的文字。这个方法接受一个图片路径作为参数,并返回一个包含识别结果的列表。每个识别结果都是一个元组,包含三个元素:边框坐标、文本内容、识别概率。
使用print函数来打印识别到的内容。content变量包含了从图片中识别出的所有文本信息,以及它们在图片中的位置和识别的置信度。

  • 识别结果
[([[39, 31], [207, 31], [207, 67], [39, 67]], '姓  名  韦小宝', 0.8973890994570185), ([[40, 82], [159, 82], [159, 119], [40, 119]], '性  别  男', 0.9799311480828728), ([[178, 86], [272, 86], [272, 116], [178, 116]], '民 族汉', 0.5456928014755249), ([[40, 131], [100, 131], [100, 161], [40, 161]], '出  生', 0.5362269878387451), ([[114, 134], [240, 134], [240, 162], [114, 162]], '1654 年12', 0.6952526392609933), ([[266, 134], [322, 134], [322, 162], [266, 162]], '20日', 0.31329770168285426), ([[42, 181], [395, 181], [395, 213], [42, 213]], '住  址  北京市东城区景山前街4号', 0.48138251996753667), ([[112, 222], [256, 222], [256, 254], [112, 254]], '紫禁城敬事房', 0.9732440311960702), ([[44, 307], [195, 307], [195, 337], [44, 337]], '公民身份证号码', 0.612808391503521), ([[212, 308], [526, 308], [526, 334], [212, 334]], '112044165412202438', 0.7003081027071493)]   

创建了一个easyocr.Reader对象,并将其赋值给变量ocr。在创建该对象时,指定两个参数:

语言列表['ch_sim', 'en']:这告诉OCR引擎识别简体中文(ch_sim)和英文(en)。
gpu=False:这个参数指定OCR处理是否使用GPU进行加速。选择不使用GPU(False),这意味着所有的OCR处理将在CPU上执行。

用ocr对象的readtext方法来执行OCR操作。这个方法接受两个参数:

图像路径image:这是要识别的图像文件的路径,之前已经定义过。
detail=0:这个参数控制返回结果的详细程度。当detail=0时,readtext方法将只返回识别到的文本内容,而不包括每个识别区域的边界框坐标和识别概率。这可以简化输出结果,使其更易于阅读和处理。如果您需要更详细的信息(如边界框和概率),可以增加detail的值(通常为1或更高)。

import easyocr
image = './id_card/1.jpg'
ocr = easyocr.Reader(['ch_sim', 'en'],gpu=False)
content = ocr.readtext(image,detail=0)
print(content)
['姓  名  韦小宝', '性  别  男', '民 族汉', '出  生', '1654 年12', '20日', '住  址  北京市东城区景山前街4号', '紫禁城敬事房', '公民身份证号码', '112044165412202438']   

 

  • 批量识别图片
    import easyocr
    import os
    images = './id_card'
    ocr = easyocr.Reader(['ch_sim', 'en'])
    content = ocr.readtext(images,detail=0)
    data = []
    for image in os.listdir(images):
        content = ocr.readtext(f'{images}/{image}', detail=0)
        print(f"正在识别:{image}")
        name = content[0][4:]
        gender = content[1][-1]
        nation = content[2][-1]
        birth = content[-5]
        if "月" not in birth:
            birth = content[-6] + "月" + content[-5]
        if "日" not in birth:
            birth = birth[:-1] + "日"
        address = content[-4][4:] + content[-3]
        number = content[-1]
        print(f"完成识别:{image}")
        print("-" * 50)
        data.append([name, gender, nation, birth, address, number])
    

    遍历图片文件夹,这里用到了os.listdir()方法以返回文件列表。然后用ocr.readtext()去识别每一张图片文字内容,接着通过字符串切片来获取姓名、性别、民族、出生、住址和身份证号等关键信息,最后统一将这些信息存入列表data中。初始化一个空列表data,用于存储从每张图片中提取的信息。使用os.listdir(images)获取指定文件夹下所有文件的列表,并遍历这些文件。对于每个文件,构建完整的文件路径,并使用ocr.readtext方法进行OCR识别。根据OCR返回的结果(这里假设结果是按照一定顺序排列的文本块),使用字符串切片和拼接操作提取出姓名、性别、民族、出生日期、住址和身份证号码等信息。
    将提取的信息打印出来,并添加到data列表中。

  • 保存数据

    import pandas as pd
    df = pd.DataFrame(data, columns=["姓名", "性别", "民族", "出生", "住址", "身份证号"])
    print(f"识别结果如下:")
    print(df)
    df.to_excel("识别结果.xlsx", index=False)
    

    图片文字识别之后,建议通过pandas输出为Excel

实验结果

使用我自己的身份证(为了安全起见,此处放上一张遮得完完全全的照片)

 

 

 结果:

 

 

 

实验过程中遇到的问题和解决过程

开始我想用一个普适所有表格的方法:使用Pyhon中的OpenCV库来实现,首先,使用OpenCV读取图像文件,然后进行图像处理,如转换为灰度图像或二值图像。然后可以使用OCR技术来提取图像中的数据。常用的0CR库包括Tesseracl和ovtesseract,这些库可以识别文本和数字,并将它们转换为计算机。可读的格式,如文本或数字。通过这种方式,获取图片中的数据并将其用于各种目的,如数据分析和机器学习。

首先,使用OCR工具获取所需文本的识别结果。

然后,使用Python中的openpyxl库打开要写入的Excel文件。

接着,定位到要写入文本的单元格,并将文本写入该单元格。

最后,保存Excel文件。

但最后仅实现了将OCR识别结果写入Excel中的A1单元格:

import openpyxl

# 打开Excel文件
wb = openpyxl.load_workbook('example.xlsx')

# 选择要写入文本的工作表
sheet = wb['Sheet1']

# 定位到要写入文本的单元格
cell = sheet['A1']

# 将文本写入单元格
cell.value = 'OCR识别结果'

# 保存Excel文件
wb.save('example.xlsx')

后来发现我并不会图像预处理将彩色图像转为灰度图像、边缘检测、轮廓检测、轮廓筛选等一系列的图像识别,于是只能转为具体的某一类图片,选择了日常团学工作密切相关的身份证。

感悟、思考

简洁却强大!简单却专业!这是我对Python的印象和感悟

作为一个初学者,我在王老师的课上收获了很多:
1.Python的语法非常简单易懂,因为我上学期学C语言很艰难,所以在开课之前,我曾经担心自己会面临很多困难,但是随着学习的深入,我发现这种担心是多余的。Python的语法和常用的编程概念都非常直观,让我很快就能够上手编写简单的程序。
2.其次,Python拥有丰富的库和框架,可以应用于各种领域。因为我的大创项目需要用到Python语言,在推进项目的过程中我使用Python编写了爬虫程序、数据分析程序和机器学习模型等,简直是为大创如虎添翼啊!
3.感谢一起参加Python公选的小伙伴们,感谢大家营造了轻松愉悦的课堂氛围,忘不了大家一起编程时的互帮互助和发自肺腑的成就感笑容,希望大家继续展现电科院学子的风采,一路生花!
4.感谢王老师的悉心指导,无论是在微信上还是线下,王老师永远是及时解答我的困惑(老师好像是24小时在线哒辛苦老师啦),您在课上通俗易懂的比喻拯救了我这种直脑,感谢您!

参考资料

  • 《Python自动化办公:批量识别图片文字并存为Excel》

https://blog.csdn.net/cxyxx12/article/details/134414512

  • 《如何使用Python识别图片并提取图片中的数据》

https://wenku.csdn.net/answer/f95f1e04808040a2be104c8f1736ed4d

目录

实验内容

实验过程

实验结果

实验过程中遇到的问题和解决过程

感悟、思考

参考资料


 

...全文
119 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

110

社区成员

发帖
与我相关
我的任务
社区描述
人生苦短,我用Python!
python3.11 高校
社区管理员
  • blackwall0321
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧