110
社区成员
发帖
与我相关
我的任务
分享课程:《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小时在线哒辛苦老师啦),您在课上通俗易懂的比喻拯救了我这种直脑,感谢您!
https://blog.csdn.net/cxyxx12/article/details/134414512
https://wenku.csdn.net/answer/f95f1e04808040a2be104c8f1736ed4d
目录