20232405 高一鸣 2023-2024-2 《Python程序设计》实验四报告

20232405gym 2024-05-29 22:05:13

课程:《Python程序设计》
班级: 2324
姓名: 高一鸣
学号:20232405
实验教师:王志强
实验日期:2024年5月15日
必修/选修: 公选课

1.实验内容

(1) 实验整体内容:

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

(1)编写从社交网络爬取数据,实现可视化舆情监控或者情感分析。

(2)利用公开数据集,开展图像分类、恶意软件检测等

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

(4)爬取天气数据,实现自动化微信提醒

(5)利用爬虫,实现自动化下载网站视频、文件等。

(6)编写小游戏:坦克大战、贪吃蛇、扫雷等等

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

(2) 实际操作内容

(1)利用Python库,基于OCR技术实现自动化提取图片中信息。

2.实验过程及结果

利用Python库,基于OCR技术实现自动化提取图片中信息

(1)实验原因
在平时的学习生活等方面,必不可少的会遇到不认识的英文单词,当我们为了便捷和节省时间的时候,可能会懒得去搜,而是直接图片文字识别再进行翻译;在别人发给你的图片上有你需要的信息时,不需要再一点一点的去摘抄,而是直接一步图片文字识别,即可捞出所有信息,再筛选你需要的信息。以上的这些便利让我对图片文字识别的深层原理产生了强烈的好奇。

(2)实验过程

1.前提准备
在进行实验之前,我在CSDN上查找了一些资料,发现要实现OCR功能,得先安装一个tesseract-ocr的安装包,所以我跟随教程进行了安装。

img

img

这里需要点击选项中的 Additional language data

img

进入这里,向下翻找到所有以chinese开头的,并选择安装

img

接下来跟着提示一路绿灯就可以咯^_^

2.代码部分
在pycharm的软件包中搜索并安装以下库

  • 安装pytesseract:用于文本识别

  • 安装tkinter:用于创建GUI

  • 安装tkinter.filedialog:用于进行文件的选择

from PIL import Image  # 导入image模块,用于图像处理
import pytesseract as pt  # 导入库,用于文本识别
import tkinter as tk  # 导入库用于创建GUI
import tkinter.filedialog as filedialog  # 导入库,用于文件选择

创建一个类,初始化应用程序窗口

class Application(tk.Tk):

设置标题为“图片文本提取”

    def __init__(self):
        super().__init__()
        self.title("图片文本提取")

设置了 Tesseract OCR 的路径,创建了一个存储图像路径的对象tk.StringVar

    pt.pytesseract.tesseract_cmd = r"C:\Program Files\Tesseract-OCR\tesseract.exe"
    self.img_path = tk.StringVar()

接下来是应用窗口的界面设计

    self.frame = tk.Frame(self)
    self.frame.pack(padx=10, pady=10)

    self.lbl_file = tk.Label(self.frame, text="图像")
    self.lbl_file.grid(row=0, column=0)
        
    self.txt_file = tk.Entry(self.frame, width=50, textvariable=self.img_path)
    self.txt_file.grid(row=0, column=1, sticky=tk.W)
        
    self.btn_file = tk.Button(self.frame, text="选择", command=self.sel_img_file)
    self.btn_file.grid(row=0, column=1, sticky=tk.E)
        
    self.lbl_txt = tk.Label(self.frame, text="文本")
    self.lbl_txt.grid(row=1, column=0)
        
    self.txt_exract = tk.Text(self.frame)
    self.txt_exract.grid(row=1, column=1)
        
    self.btn_extract = tk.Button(self.frame, text="提取文本", command=self.extract_text)
    self.btn_extract.grid(row=2, column=1, sticky=tk.W+tk.E)

img

窗口功能设计

定义了一个用于选择图像文件的方法,将所选文件路径显示在文本框中。

    def sel_img_file(self):  # 选择图像文件
        self.img_path.set(filedialog.askopenfilename(title="选择图片", initialdir="."))

定义了一个用于提取图像文本的方法,它打开选定的图像文件,使用Tesseract将图像中的文本提取出来,然后将提取的文本显示在文本框中。

    def extract_text(self):  # 提取图像文本
        if self.img_path:
            img = Image.open(self.img_path.get())
            text = pt.image_to_string(img, lang="chi_sim")
            self.txt_exract.delete(1.0, tk.END)
            self.txt_exract.insert(tk.END, text)

最后,在__main__部分,创建了一个Application实例,并调用mainloop()方法启动GUI应用程序的事件循环,使用户可以进行操作。

if __name__ == "__main__":
    app = Application()
    app.mainloop()

3.完整代码

from PIL import Image  # 导入image模块,用于图像处理
import pytesseract as pt  # 导入库,用于文本识别
import tkinter as tk  # 导入库用于创建GUI
import tkinter.filedialog as filedialog  # 导入库,用于文件选择


class Application(tk.Tk):  # 应用程序窗口
    
    def __init__(self):
        super().__init__()
        self.title("图片文本提取")

        pt.pytesseract.tesseract_cmd = r"C:\Program Files\Tesseract-OCR\tesseract.exe"
        self.img_path = tk.StringVar()

        self.frame = tk.Frame(self)
        self.frame.pack(padx=10, pady=10)

        self.lbl_file = tk.Label(self.frame, text="图像")
        self.lbl_file.grid(row=0, column=0)
        
        self.txt_file = tk.Entry(self.frame, width=50, textvariable=self.img_path)
        self.txt_file.grid(row=0, column=1, sticky=tk.W)
        
        self.btn_file = tk.Button(self.frame, text="选择", command=self.sel_img_file)
        self.btn_file.grid(row=0, column=1, sticky=tk.E)
        
        self.lbl_txt = tk.Label(self.frame, text="文本")
        self.lbl_txt.grid(row=1, column=0)
        
        self.txt_exract = tk.Text(self.frame)
        self.txt_exract.grid(row=1, column=1)
        
        self.btn_extract = tk.Button(self.frame, text="提取文本", command=self.extract_text)
        self.btn_extract.grid(row=2, column=1, sticky=tk.W+tk.E)
        
        
    def sel_img_file(self):  # 选择图像文件
        self.img_path.set(filedialog.askopenfilename(title="选择图片", initialdir="."))


    def extract_text(self):  # 提取图像文本
        if self.img_path:
            img = Image.open(self.img_path.get())
            text = pt.image_to_string(img, lang="chi_sim")
            self.txt_exract.delete(1.0, tk.END)
            self.txt_exract.insert(tk.END, text)

if __name__ == "__main__":
    app = Application()
    app.mainloop()

4.实验结果
可以提取大部分文字,包括中文和英文(一些特殊字体不会被识别、近似于文字的图案可能会被误识别)

3.实验过程中遇到的问题和解决方法

  • 问题一:在准备过程中,找不到适合可用的OCR的安装包。

  • 问题一解决方案:在B站上找到相关的up主,通过私信和关注公众号的方式获得。

  • 问题二:安装库时,不知道不同库对应的安装命令。

  • 问题二解决方案:在CSDN上查找相关资料。

  • 问题三:应用窗口的界面设计不熟悉。

  • 问题三解决方案:B站等教育视频中,学习其他窗口的设计,进而移植到本实验。

  • 问题四:无法识别中文。

  • 问题四解决方案:在提取图片文本的方法中,加上 text = pt.image_to_string(img, lang="chi_sim")即可识别中文

  • 问题五:不能识别一些距离较近或者大小较小的文字。

  • 问题五解决方案:暂未解决,搜集资料得可能需要更加完善的程序和结构,而我现在暂时还做不到,在以后的更深层学习中慢慢解决。

4.其他(感悟,思考等)

(1)感悟:
在这个综合实验中,我在之前的基础上,更加了解到了python的超凡之处,也随着实验的进行,一点一点地在揭开她神秘的面纱,窥探她面纱后不为人知的美妙与吸引,在这次实验中,我应用了图片文字的识别,其功能也与爬虫类似,让我更加了解到python的便利性,在一定程度上解开了我上面提到过的对文字识别的疑惑和好奇,让我对python的兴趣愈来愈浓厚;此外,在实验中我还会遇到数不胜数的问题和困难,但是我对“真相”的求知让这些都不再重要,在我眼中重要的是遇到问题后一次又一次去寻找解决方法的过程和心态,这也注定了我最后能够完成这一个简易的小程序,对于我来说,这是我的第一次,但不会是最后一次,我相信,我也有决心!
(2)课程感想体会、意见及建议:
我在这学期之前是没有触碰过python的,或者说我在大学之前是没有接触过计算机的(只限于玩游戏,老师别太较真哈),所以我来这所学校是有很大压力的,这也让我应该且必须要更努力去学习它,平时学的C语言对我来说已经够了,但是我为什么还报一门语言的学习呢,其实我和王老师的缘分是来自学长的推荐的,他告诉我如果你想真正学到东西,就去上王老师的课,所以我就来了,而且我也相信了学长没有骗我,在这学期的课中,我学到的不是只有python相关的内容,还有如何让别人信服你说的话,只有亮出自己的实力;做好一份工作,要有一丝不苟,严谨细致的态度等等,这让我在以后的学习工作中更强化了我的信念。虽然只有短短几节课就讲完了整本书,但是没有一节课是枯燥的,在王老师的带动下课堂氛围被带领的起伏有致,尤其是好几次把我写进了程序里,看着老师也笑的合不拢嘴,现在想想是很开心和荣幸的,因为我也在这节课上带给了别人快乐。最后感谢王老师这学期的辛苦付出和陪伴,希望以后有机会还能和王老师交流。
最后有一点建议就是,课前的签到手势可不可以再复杂一点,之前的那些手势根本没挑战啊^_^。

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

110

社区成员

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

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