118博金宝网址 Python 用Python从图像中提取文本

用Python从图像中提取文本

从“计算机如何将图像识别为苹果”的时代开始,机器视觉已经取得了长足的进步。有许多可用的工具可以轻松地帮助识别图像的内容。上一篇文章已经讨论过这个主题Python和SQL Server中的图像识别,提出了一种通过内容编程识别图像的解决方案。光学字符识别(OCR)更进一步,允许开发人员提取图像中呈现的文本。提取文本将允许文本可索引和可搜索。我们将在今天的Python编程教程中讨论这个主题。

你可以在我们的教程中阅读更多关于图像识别的内容:Python和SQL Server中的图像识别

什么是OCR?

OCR——或光学字符识别——在数字化纸质文物(如文件、报纸和其他物理媒体)的很久以前一直是一个相当热门的话题,但是,随着纸张已经被淘汰,OCR虽然继续是一个热门的研究话题,但作为一种“流行文化技术”,它被暂时搁置了。

屏幕截图作为一种记笔记的方法改变了这一轨迹。信息消费者通常不希望下载PowerPoint演示文稿并进行搜索。他们只是把他们感兴趣的幻灯片拍下来,然后保存下来。识别这些照片中的文字已经成为大多数照片管理软件的标准功能。但是开发人员如何将这种技术集成到他或她自己的软件项目中呢?

谷歌的超正方体提供给软件开发人员以“廉价”的价格获得“商业级”OCR软件。超正方体是开源的,在Apache 2.0许可下提供,这给了开发人员很大的空间,可以将该软件包含在他们自己的产品中。本软件开发教程将侧重于实现超正方体在Ubuntu Linux环境中,因为对于初学者来说这是最容易利用的环境。

OCR不是灵丹妙药

在进入技术细节之前,重要的是摒弃OCR总能神奇地读取图像中的所有文本的想法。即使经过几十年的努力研究,仍然有一些实例表明OCR可能不是文本提取的最佳解决方案。在某些情况下,根据用例不同,可能需要使用不同的OCR软件。超正方体特别是可能需要额外的“训练”(它的行话)才能更好地从图像中读取文本数据。超正方体总是能更好地配合300 dpi(点每英寸)或更高的图像。这是典型的印刷质量,而不是网页质量。在正确读取输入图像之前,您可能还需要对其进行“按摩”。

然而,开箱即用,超正方体对于从图像中提取足够多的文本以完成您在软件应用程序中可能需要做的事情的目的来说,可以“足够好”。

读:最好的Python IDE和代码编辑器

如何安装魔方

安装超正方体在基于debian的Linux中很容易。支持软件包安装。对于基于debian的Linux发行版,如Kali或Ubuntu,使用以下命令:

$ sudo安装tesseract-ocr

如果您在安装时遇到问题超正方体以这种方式,你可能需要更新你的Linux安装如下:

$ sudo apt update -y;Sudo apt upgrade -y

对于其他Linux发行版,Windows或MacOS,将有必要从源代码构建

如何从命令行运行Tesseract

一次超正方体安装时,它可以直接从终端运行。考虑以下图像,以及生成的文本输出超正方体.要在标准输出中显示提取的文本,使用以下命令:

$ tesseract imageFile标准输出

下面是一些输出示例,以及带有文本的原始图像。这些来自幻灯片,通常是学生们在教室里拍摄的那种:

示例1

从图像中提取文本

示例2

在Python中如何从图像中提取文本

示例3

Python文本提取教程

在上面的每个例子中,“不太”准确捕获的文本都用红色矩形突出显示。这可能是由于演示质量图像dpi (72 dpi)用于这些图像。如下图所示,有些图片的阅读效果比其他图片好:

示例4

在Python中提取文本 请注意以上并不是一个缺陷超正方体.“训练”是可能的超正方体识别不同的字体。此外,如果您正在扫描文档,您可以将扫描仪配置为以更高的dpi级别读取。

Python中使用pytessract的编程式文本提取

自然,在程序上下文中提取文本是下一个合乎逻辑的步骤。虽然总是可以在Python或其他语言中使用系统调用来执行超正方体程序,使用API来处理这样的调用要优雅得多。

有一件重要的事情需要注意:虽然打电话并不是“禁止”的超正方体通过编程语言中的系统调用,必须注意确保没有未经检查的用户输入传递给该系统调用。如果没有执行这样的检查,那么外部用户就有可能使用构造良好的文件名或其他信息在您的系统上运行命令。

Python模块pytesseract类的包装器超正方体应用程序。pytesseract可以通过命令安装:

$ pip3 install pytesseract

注意,如果你访问Python 3。X通过python而不是命令python3,您将需要使用命令:

$ PIP安装pytesseract

下面的示例代码将使用Python和从当前目录中的任何图像文件中提取它能找到的所有文本pytesseract

# !/usr/bin/python3 # mass- cro -images.py from PIL import Image import os import pytesseract import sys #必须指定tesseract可执行文件的完整路径。在Linux中,可以使用命令:# which tesseract pytesseract.pytesseract。Tesseract_cmd = r'/usr/bin/tesseract' def main(argv): for文件名in os.listdir("."): if str(文件名)不在['.]中。”、“. .']: nameParts = str(filename).split(".") if nameParts[-1].lower() in ["gif", "png", "jpg", "jpeg", "tif", "tiff"]:try: print ("Found filename [" + str(filename) + "]") ocrText = pytesseract.image_to_string(str(filename), timeout=5) print (ocrText) print ("" Exception as err: print("处理[" + str(filename) + "]失败,由于错误[" + str(err) + "]") if __name__ == "__main__": main(sys.argv[1:]))

在Python中使用数据库存储图像和提取的文本

我们可以使用数据库来存储这两个图像和提取的文本。这将允许开发人员编写一个应用程序,可以根据文本搜索并告诉我们哪个图像与此文本匹配。下面的代码通过将收集到的数据保存到MariaDB数据库来扩展第一个清单:

# !/usr/bin/python3 # ocr-import-images.pyconnector import os import pytesseract import shutil import sys #必须指定tesseract可执行文件的完整路径。在Linux中,可以使用命令:# which tesseract pytesseract.pytesseract。Tesseract_cmd = r'/usr/bin/tesseract' def main(argv): try: conn = mysql.connector。connect(user='rd_user', password='myPW1234%', host='127.0.0.1', port=63306, database='RazorDemo') cursor = conn.cursor() for filename in os.listdir("."): if str(filename)不在['.]中。”、“. .']: nameParts = str(filename).split(".") if nameParts[-1].lower() in ["gif", "png", "jpg", "jpeg", "tif", "tiff"]:try: print ("Found filename [" + str(filename) + "]") ocrText = pytesseract.image_to_string(str(filename), timeout=5) fout = open("temp.txt", "w") fout。write (ocrText) fout.close() #插入数据库记录:sql0 = " Insert into Images (file_name) values (%s)" values0 = [str(filename)]游标。我们需要上次插入时创建的主键标识符,以便插入提取的#文本和二进制数据。lastInsertID =游标。lastrowid print (" rdid of insert is [" + str(lastInsertID) + "]") shutil.copyfile("temp.txt", "/tmp/db-tmp/temp.txt") shutil.copyfile(str(filename), "/tmp/db-tmp/" + str(filename)) # Also, FILE privileges may be needed for the MariaDB user account: # grant file on *.* to 'rd_user'@'%'; # flush privileges; sql1 = "update Images set extracted_text=LOAD_FILE(%s), file_data=LOAD_FILE(%s) where rcdid=%s" values1 = ["/tmp/db-tmp/temp.txt", "/tmp/db-tmp/" + str(filename), str(lastInsertID)] cursor.execute(sql1, values1) conn.commit() os.remove("/tmp/db-tmp/temp.txt") os.remove("/tmp/db-tmp/" + str(filename)) except Exception as err: print ("Processing of [" + str(filename) + "] failed due to error [" + str(err) + "]") cursor.close() conn.close() except Exception as err: print ("Processing failed due to error [" + str(err) + "]") if __name__ == "__main__": main(sys.argv[1:])

上面的Python代码示例与具有以下结构的MariaDB表交互:

create table Images (rcdid int not null auto_increment primary key, file_name varchar(255) not null, extracted_text longtext null, file_data longblob null);

在上面的代码示例中,量变而且longblob之所以选择这些类型,是因为这些数据类型分别指向大量文本或二进制数据。

如何加载文件数据到MariaDB

将二进制或非标准文本加载到任何数据库都会带来各种各样的挑战,特别是在考虑到文本编码的情况下。在大多数流行的RDBMS中,二进制数据几乎从不通过用于其他类型数据的典型插入语句插入或更新数据库记录。相反,专门化语句用于此类任务。

特别是MariaDB,文件任何此类操作都需要权限。在典型的格兰特将数据库权限授予用户帐户的语句。相反,文件权限必须通过一组单独的命令授予服务器本身。要在MariaDB中做到这一点rd_user在我们的第二个代码示例中使用的帐户,将需要使用其根帐户登录到MariaDB并执行以下命令:

授权文件*。*到'rd_user'@'%';冲洗特权;

一次文件权限被授予加载文件命令可用于加载量变longblob数据转换为特定的现有的记录。下面的示例显示如何附加量变longblob数据到MariaDB数据库中的现有记录:

—对于提取的文本,可以包含非标准字符。更新图像set extracted_text=LOAD_FILE('/tmp/test.txt') where rcdid=rcdid——对于二进制图像数据更新图像set file_data=LOAD_FILE('/tmp/myImage.png') where rcdid=rcdid

如果你使用典型的select *语句在运行这些更新后,你会得到一个不是很有用的结果:

从图像提取的Python文本教程

相反,选择数据的子字符串:

MAriaDB查询

这个查询的结果更有用,至少可以确保记录被填充:

从图像中提取文本

要将这些数据提取回文件,请使用specialized选择报表如下:

select extracted_text into dumpfile '/tmp/ppt-slide-3-text.txt' from Images where rcdid=117;select file_data into dumpfile '/tmp/Sample PPT Slide 3.png' from Images where rcdid=117;

注意,除了将输出写入上面的文件之外,这两个查询都没有“特殊输出”。

要创建文件的目录必须由MariaDB守护进程所在的用户帐户可写。与解压缩文件同名的文件不能已经存在。

文件数据应该匹配最初加载的内容:

从图像中提取文本

图像也将匹配:

Python文本处理教程

从数据库中读取的图像,包括使用鱼翅命令查看。

然后可以将这些SQL语句合并到外部应用程序中,以检索此信息。

如何查询数据库中的图像

随着图像加载到数据库中,以及他们提取的OCR文本,传统的SQL查询可以用来找到一个特定的图像:

MariaDB查询示例

请注意,在MariaDB中,传统的文本比较不能使用量变列。这些必须铸造成varchar格式

输出如下:

Python图像处理教程

关于使用Python和MariaDB从图像中提取文本的最后想法

谷歌的超正方体可以很容易地让你将动态OCR整合到你的应用程序中。这将允许您的用户更容易、更容易地提取和使用这些图像中可能包含的文本。但开箱即用的超正方体可以走得更远。对于上面显示的所有“胡言乱语”结果,超正方体可以由开发人员训练读取它不能识别的字符,进一步扩展其可用性。

考虑到人工智能等技术正变得越来越主流,我们不难想象,随着时间的推移,OCR只会变得更好、更容易,但是超正方体是一个很好的起点。OCR已经被用于复杂的任务,比如“动态”语言翻译。这在不久前还被认为是不可想象的。谁知道我们还能走多远?

阅读更多Python编程教程和软件开发指南

最新的文章

有关的故事

Baidu
map