首頁 >後端開發 >Python教學 >python實作簡單的圖片文字辨識腳本

python實作簡單的圖片文字辨識腳本

零到壹度
零到壹度原創
2018-04-04 13:59:5514319瀏覽

我们都知道,部分电子版的书籍是以扫描图片的形式展现的,在阅读过程中无法选取文字。对于平时有记录习惯的人来说,无法复制黏贴真的很不爽! 为了解决这个问题,需要这样一个脚本,他有下面这些功能:

1、能够实现自由截图
2、能够识别含有文字的截图
3、将识别出的文字输出到剪切板

大致上需要的东西非常明确,那么,一个一个的来~

截图

截图作为一项非常实用的功能,自然是有各种各样的实现,在这里考虑使用python去完成这个任务,那么自然是先google一下,网上一搜,果然资料多到爆炸~
不出所料,python对截图功能做了很好的基础支持~(本文基于windows平台下的python2实现,python3安装某些库真滴烦人)
(1)全屏截图
那么先从简单的做起(截图稍微麻烦一点,其他部分都超级简单 = =),首先实现python的“全屏截图”
代码入下:

from PIL import ImageGrab

im = ImageGrab.grab()  # 截取全屏
im.save(file)

简单的三行代码搞定~(赞美一下前人的伟大_(:з)∠)_)
其中的path表示文件截图文件的完整存放路径
其中稍微要注意一下的是,安装库的时候,使用

pip install pillow(而不是PIL)

否则会显示找不到匹配的模块~
(PS:这里其实有个问题,上述代码运行完成后,并没有截取全屏,最后生成的图片仅仅为部分图片,查看网上攻略后并没有找到比较好的解决方法,残念…)

(2)自由截图
好了,全屏截图完成,那么我们其实只想要截取需要的部分就行了,那么怎么去完成这个功能呢~
看了一部分网上的做法,最常见的就是监听鼠标动作实现选择截图区域。其中,其中使用较多的是tkinter,以及pyHook(tkinter实现那个稍微复杂一点),我个人倾向于后者,因为实现起来非常简单,哈哈~
那么先上部分代码

# coding:utf-8
import win32api
import os
from PIL 
import ImageGrab, Imageimport pyHook
import pythoncom

# 创建一个坐标列表(x1,y1,x2,y2)
coordinate = [1, 1, 1, 1]

# 监听键盘事件
def on_mouse_event(event):
    file_path = 'xx//xx//read.jpg'
    # 监听鼠标事件
    if event.MessageName == 'mouse left down':
        coordinate[0:2] = event.Position    
    elif event.MessageName == 'mouse left up':
        coordinate[2:4] = event.Position
        win32api.PostQuitMessage()  # 退出监听循环
        # 截取坐标图片
        pic = ImageGrab.grab(coordinate)
        pic.save(file_path)

唯一比较麻烦的就是各种库的安装,重点点名pywin32这个库 = =,真姬儿麻烦~
那么在这里附上链接,防止安装过程中可能出现的问题:
解决安装pywin32后仍然提示找不到模块的问题

文字识别

搞定了截图功能以后,剩下的工作就比较简单了。python的pytesseract为文字识别提供了很好的支持。整个实现只需要一行关键代码即可:

from PIL import Image
import pytesseract
text=pytesseract.image_to_string(Image.open(file_path),lang='chi_sim')
print(text)

使用这个库之前,必须安装识别引擎tesseract-ocr,下载链接如下(下载完成后为exe安装包):
tesseract-ocr识别引擎下载
这里附上安装及配置环境变量的教程(摘自百度百科):
图片文字OCR识别-tesseract-ocr4.00.00安装使用
最后,在pytesseract库文件中进行配置,找到F:\XX\XX\XX\你的python安装路径\Lib\site-packages\pytesseract
找到该路径下的pytesseract.py文件,打开后找到一下这句代码:

tesseract_cmd = 'tesseract'

将字符串’tesseract’替换成你的tesseract-ocr的安装路径(e.g.’F:\Program_File\Tesseract-OCR\tesseract.exe’)

至此,文字识别引擎的全部配置就已经完成了。

访问剪切板

最后,将识别好的文字导入剪切板
两步到位:
(1)pip安装pyperclip库
(2)同样一行代码:

pyperclip.copy(text)  # 将识别内容导入系统剪切板

大功告成~

总结

整个代码实现非常的简洁,总共也就几十行不到的代码,这也多亏了python强大的库支持。
然而比较遗憾的是,截图功能的实现很是简陋,使用tkinter可以实现出类似QQ截图的效果(代码也相对复杂一些)~
有了这个脚本之后,看扫描图片的PDF电子书就不需要打字记笔记了~吼吼吼~:)
最后附上完整的代码

# coding:utf-8
import inspect
import win32api
import os
from PIL import ImageGrab, Image
import pyHook  # 钩子~
import pythoncom
import pytesseract  # 图像识别文字包
import pyperclip

# 创建一个坐标列表
coordinate = [1, 1, 1, 1]

# 监听键盘事件
def on_mouse_event(event):
    # 获取当前文件路径
    file_ = inspect.getfile(inspect.currentframe())
    dir_path = os.path.abspath(os.path.dirname(file_))
    file_path = dir_path + '\\read.jpg'
    # 监听鼠标事件
    if event.MessageName == 'mouse left down':
        coordinate[0:2] = event.Position    
    elif event.MessageName == 'mouse left up':
        coordinate[2:4] = event.Position
        win32api.PostQuitMessage()  # 退出监听循环
        # 截取坐标图片
        pic = ImageGrab.grab(coordinate)
        pic.save(file_path)
        text = pytesseract.image_to_string(Image.open(file_path), lang='chi_sim')  # 识别并返回
        pyperclip.copy(text.replace(' ', ''))  # 将识别内容导入系统剪切板
   return True
   
   
    if __name__ == '__main__':
    hm = pyHook.HookManager()  # 创建一个钩子管理对象
    hm.MouseAll = on_mouse_event  # 监听所有鼠标事件
    hm.HookMouse()  # 设定鼠标钩子
    pythoncom.PumpMessages()  # 进入循环,程序一直监听

快毕业了,除了准备答辩之外,就是看看书,各种瞎晃~
那么,这两天在看书的时候遇到这么个问题:
首先,部分电子版的书籍是以扫描图片的形式展现的,在阅读过程中无法选取文字。对于平时有记录习惯的我来说,无法复制黏贴真的很不爽!
为了解决这个问题,我需要这样一个脚本,他有下面这些功能:

1、能够实现自由截图
2、能够识别含有文字的截图
3、将识别出的文字输出到剪切板

大致上需要的东西非常明确,那么,一个一个的来~

截图

截图作为一项非常实用的功能,自然是有各种各样的实现,在这里考虑使用python去完成这个任务,那么自然是先google一下,网上一搜,果然资料多到爆炸~
不出所料,python对截图功能做了很好的基础支持~(本文基于windows平台下的python2实现,python3安装某些库真滴烦人)
(1)全屏截图
那么先从简单的做起(截图稍微麻烦一点,其他部分都超级简单 = =),首先实现python的“全屏截图”
代码入下:

from PIL import ImageGrab

im = ImageGrab.grab()  # 截取全屏im.save(file)

简单的三行代码搞定~(赞美一下前人的伟大_(:з)∠)_)
其中的path表示文件截图文件的完整存放路径
其中稍微要注意一下的是,安装库的时候,使用

pip install pillow(而不是PIL)

否则会显示找不到匹配的模块~
(PS:这里其实有个问题,上述代码运行完成后,并没有截取全屏,最后生成的图片仅仅为部分图片,查看网上攻略后并没有找到比较好的解决方法,残念…)

(2)自由截图
好了,全屏截图完成,那么我们其实只想要截取需要的部分就行了,那么怎么去完成这个功能呢~
看了一部分网上的做法,最常见的就是监听鼠标动作实现选择截图区域。其中,其中使用较多的是tkinter,以及pyHook(tkinter实现那个稍微复杂一点),我个人倾向于后者,因为实现起来非常简单,哈哈~
那么先上部分代码

# coding:utf-8import win32apiimport osfrom PIL import ImageGrab, Imageimport pyHookimport pythoncom# 创建一个坐标列表(x1,y1,x2,y2)coordinate = [1, 1, 1, 1]# 监听键盘事件def on_mouse_event(event):
    file_path = 'xx//xx//read.jpg'
    # 监听鼠标事件
    if event.MessageName == 'mouse left down':
        coordinate[0:2] = event.Position    elif event.MessageName == 'mouse left up':
        coordinate[2:4] = event.Position
        win32api.PostQuitMessage()  # 退出监听循环
        # 截取坐标图片
        pic = ImageGrab.grab(coordinate)
        pic.save(file_path)

唯一比较麻烦的就是各种库的安装,重点点名pywin32这个库 = =,真姬儿麻烦~
那么在这里附上链接,防止安装过程中可能出现的问题:
解决安装pywin32后仍然提示找不到模块的问题

文字识别

搞定了截图功能以后,剩下的工作就比较简单了。python的pytesseract为文字识别提供了很好的支持。整个实现只需要一行关键代码即可:

from PIL import Imageimport pytesseract
text=pytesseract.image_to_string(Image.open(file_path),lang='chi_sim')
print(text)

使用这个库之前,必须安装识别引擎tesseract-ocr,下载链接如下(下载完成后为exe安装包):
tesseract-ocr识别引擎下载
这里附上安装及配置环境变量的教程(摘自百度百科):
图片文字OCR识别-tesseract-ocr4.00.00安装使用
最后,在pytesseract库文件中进行配置,找到F:\XX\XX\XX\你的python安装路径\Lib\site-packages\pytesseract
找到该路径下的pytesseract.py文件,打开后找到一下这句代码:

tesseract_cmd = 'tesseract'

将字符串’tesseract’替换成你的tesseract-ocr的安装路径(e.g.’F:\Program_File\Tesseract-OCR\tesseract.exe’)

至此,文字识别引擎的全部配置就已经完成了。

访问剪切板

最后,将识别好的文字导入剪切板
两步到位:
(1)pip安装pyperclip库
(2)同样一行代码:

pyperclip.copy(text)  # 将识别内容导入系统剪切板

大功告成~

总结

整个代码实现非常的简洁,总共也就几十行不到的代码,这也多亏了python强大的库支持。
然而比较遗憾的是,截图功能的实现很是简陋,使用tkinter可以实现出类似QQ截图的效果(代码也相对复杂一些)~
有了这个脚本之后,看扫描图片的PDF电子书就不需要打字记笔记了~吼吼吼~:)
最后附上完整的代码

# coding:utf-8import inspectimport win32apiimport osfrom PIL import ImageGrab, Imageimport pyHook  # 钩子~import pythoncomimport pytesseract  # 图像识别文字包import pyperclip# 创建一个坐标列表coordinate = [1, 1, 1, 1]# 监听键盘事件def on_mouse_event(event):
    # 获取当前文件路径
    file_ = inspect.getfile(inspect.currentframe())
    dir_path = os.path.abspath(os.path.dirname(file_))
    file_path = dir_path + '\\read.jpg'
    # 监听鼠标事件
    if event.MessageName == 'mouse left down':
        coordinate[0:2] = event.Position    elif event.MessageName == 'mouse left up':
        coordinate[2:4] = event.Position
        win32api.PostQuitMessage()  # 退出监听循环
        # 截取坐标图片
        pic = ImageGrab.grab(coordinate)
        pic.save(file_path)
        text = pytesseract.image_to_string(Image.open(file_path), lang='chi_sim')  # 识别并返回
        pyperclip.copy(text.replace(' ', ''))  # 将识别内容导入系统剪切板
    return Trueif __name__ == '__main__':
    hm = pyHook.HookManager()  # 创建一个钩子管理对象
    hm.MouseAll = on_mouse_event  # 监听所有鼠标事件
    hm.HookMouse()  # 设定鼠标钩子
    pythoncom.PumpMessages()  # 进入循环,程序一直监听

以上是python實作簡單的圖片文字辨識腳本的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn