广告
返回顶部
首页 > 资讯 > 后端开发 > PHP编程 >PHP怎么从图像中读取文字
  • 471
分享到

PHP怎么从图像中读取文字

2023-06-17 05:06:01 471人浏览 泡泡鱼
摘要

这篇文章主要讲解了“PHP怎么从图像中读取文字”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“php怎么从图像中读取文字”吧!Tesseract是一个能实现OCR的开源项目。你能在*Nix系统

这篇文章主要讲解了“PHP怎么从图像中读取文字”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“php怎么从图像中读取文字”吧!

Tesseract是一个能实现OCR的开源项目。你能在*Nix系统,Mac系统和windows系统上运行这个项目,但是只要使用一个库,我们就能在PHP项目中使用它了。本教程的目的是教你如何使用。

安装

准备

为了让事情变得简单和一致的, 我们将使用虚拟机(本文使用Vagrant)来运行应用程序,这会涉及到安装PHP和Nginx,我们将安装 Tesseract来分别演示过程。如果你想自己基于现有Debian-based系统安装Tesseract,你可以跳过下一部分—或者查看the README来获得在其他*nix上,Mac系统或者Windows的安装指导.

配置Vagrant

为了配置Vagrant以跟上本教程,完成如下步骤。或者你也可以简单的从GitHub获得代码。

输入以下命令来下载Homestead Improved Vagrant配置到一个名为orc的文件夹:

git clone https://github.com/Swader/homestead_improved ocr

将Nginx配置文件Homestead.yml中的以下代码:

sites:     - map: homestead.app       to: /home/vagrant/Code/Project/public

修改成:

sites:     - map: homestead.app       to: /home/vagrant/Code/public

同样要在hosts文件中添加

192.168.10.10       homestead.app

安装Tesseract

下一步是安装Tesseract

因为Homestead Improved 使用debian,我们可以在使用vagrant ssh登陆虚拟机后使用apt-get 来安装它,简单运行如下命令:

sudo apt-get install tesseract-ocr

正如上文提到的,在the README中有其他的操作系统对应教程。

测试并定制安装

我们将使用PHP包装,但是之前我们可以在命令行测试Tesseract。

首先保存这个图片sign.png

在虚拟机中,执行如下命令来从图片中读取文字

tesseract sign.png out

这将在当前文件夹创建一个文件:out.txt里面应该有单词:CAUTioN

现在尝试sign2.jpg

tesseract sign2.jpg out

这次产生单词Einbahnstral’ie。很接近但不正确—虽然图像中的文字相当清晰,它没能识别字符ß。

为了获使Tesseract正常读取字符串,我们需要安装一些新的语言文件—就本例来说,德语。

这里有一个全面的可用语言文件列表,但我们直接下载所需的文件:

wget Https://tesseract-ocr.Googlecode.com/files/tesseract-ocr-3.02.deu.tar.gz

解压:

tar zxvf tesseract-ocr-3.02.deu.tar.gz

然后把文件复制到如下目录:

/usr/share/tesseract-ocr/tessdata

例如

cp deu-frak.traineddata /usr/share/tesseract-ocr/tessdata cp deu.traineddata /usr/share/tesseract-ocr/tessdata

现在我们再次执行原来的命令但是要用 –l

tesseract sign2.jpg out -l deu      “deu” 是德语的 ISO 639-3码.

这次,文字应该是Einbahnstraße(正确的)。

可以通过重复上述过程来使用任意语言。

配置应用程序

我们将使用这个库来用PHP使用Tesseract。

我们将建立一个极简的WEB应用:用户上传图片,并查看OCR处理结果。我们将使用Silex microframework 来实现。不要担心你不熟悉它,这个应用本身很简单。

记住这篇教程的所有代码都能在Github上获得。

***步是用Composer来安装依赖文件:

composer require silex/silex twig/twig thiagoalessio/tesseract_ocr:dev-master

然后建立三个文件夹:

- public - uploads - views

我们需要上传表单(views\index.twig):

<html>   <head>     <title>OCR</title>   </head>   <body>      <fORM action="" method="post" enctype="multipart/form-data">       <input type="file" name="upload">       <input type="submit">     </form>    </body> </html>

需要一个结果展示页面(views\results.twig)::

<html>   <head>     <title>OCR</title>   </head>   <body>      <h3>Results</h3>      <textarea cols="50" rows="10">{{ text }}</textarea>      <hr>      <a href="/">&larr; Go back</a>    </body> </html>

现在建立skeleton Silex app (public\index.php):

<php  require __DIR__.'/../vendor/autoload.php';  use Symfony\Component\HttpFoundation\Request;  $app = new Silex\Application();  $app->reGISter(new Silex\Provider\TwigServiceProvider(), [   'twig.path' => __DIR__.'/../views', ]);  $app['debug'] = true;  $app->get('/', function() use ($app) {    return $app['twig']->render('index.twig');  });  $app->post('/', function(Request $request) use ($app) {      // TODO  });  $app->run();

如果你在浏览器访问这个应用,你应该能看到一个文件上传表单。如果你在使用Homestead Improved Vagrant,你可以通过如下链接访问该应用。

http://homestead.app/

下一步是实现文件上传。Silex使得这项工作非常简单;$request包含一个files组件,我们可以通过它来获得任意上传的文件,代码:

// Grab the uploaded file $file = $request->files->get('upload');  // Extract some information about the uploaded file $info = new SplFileInfo($file->getClientOriginalName());  // Create a quasi-random filename $filename = sprintf('%d.%s', time(), $info->getExtension());  // Copy the file $file->move(__DIR__.'/../uploads', $filename);

如你所见,我们产生随机文件名来减少文件名冲突&mdash;但在本应用中,我们怎么命名文件是不重要的。一旦我们在本地有一份文件拷贝,我们就可以产生一个Tessearct库的实例,然后进行分析:

// Instantiate the Tessearct library $tesseract = new TesseractOCR(__DIR__ . '/../uploads/' . $filename);

在图像上实现OCR相当简单,我们只需调用方法recognize()。

// Perform OCR on the uploaded image $text = $tesseract->recognize();

***我们把结果展示到结果页面:

return $app['twig']->render(     'results.twig',     [         'text'  =>  $text,     ] );

在一些图片上尝试,看看它效果怎样。如果你有困难,可以参考这个

一个实际的例子

让我们来看OCR一个更实用的例子。在本例中,我们尝试在图像中找到一个格式化的电话号码。

看看下面一幅图,上传到你的应用:

PHP怎么从图像中读取文字

结果应该如下:

:ii&lsquo;i Customer Service Helplines  British Airways Helpline  09040 490 541

它没有挑出正文文本,这是我们能料到的,因为图片质量太差。虽然识别了号码但是也有一些“噪声”。

为了提取相关信息,有如下几件事我们可以做。

你可以让Tesseract 把它的结果限制在一定的字符集内,所以我们告诉它只返回数字型的内容代码如下:

$tesseract->setWhitelist(range(0,9));

但这样有个问题。它常常把非数字字符解释成数字而非忽略它们。比如“Bob”可能被解释称数字“808”。

所以我们采用两步处理。

  1. 尝试提取可能是电话号码的数字串。

  2. 用一个库轮流评估每一个候选字符,一旦找到一个有效电话号码则停止。

***步,我们可以用一个基本的正则表达式。可以用谷歌电话库来确定一个数字串是否是合法电话号码。

备注:我已在Sitepoint 写过关于谷歌电话库的内容。

让我们给谷歌电话库添加一个PHP 端口,修改composer.JSON,添加:

"giggsey/libphonenumber-for-php": "~7.0"

别忘了升级:

composer update

现在我们可以写一个函数,输入为一个字符串,尝试提取一个合法的电话号码

 function findPhoneNumber($text, $country_code = 'GB') {    // Get an instance of Google's libphonenumber   $phoneUtil = \libphonenumber\PhoneNumberUtil::getInstance();    // Use a simple regular expression to try and find candidate phone numbers   preg_match_all('/(\+\d+)?\s*(\(\d+\))?([\s-]?\d+)+/', $text, $matches);    // Iterate through the matches   foreach ($matches as $match) {      foreach ($match as $value) {        try {          // Attempt to parse the number         $number = $phoneUtil->parse(trim($value), $country_code);             // Just because we parsed it successfully, doesn't make it vald - so check it         if ($phoneUtil->isValidNumber($number)) {            // We've found a telephone number. Format using E.164, and exit           return $phoneUtil->format($number, \libphonenumber\PhoneNumberFormat::E164);          }        } catch (\libphonenumber\NumberParseException $e) {          // Ignore silently; getting here simply means we found something that isn't a phone number        }      }   }    return null;  }

希望注释能解释这个函数在干什么。注意如果这个库没能从字符串中解析出一个合法的电话号码它会抛出一个异常。这不是什么问题;我们直接忽略它并继续下一个候选字符。

如果我们找到一个电话号码,我们以E.164的形式返回它。这提供了一个国际化的号码,我们可以用来打电话或者发送SMS。

现在我们可以如下使用:

$text = $tesseract->recognize(); $number = findPhoneNumber($text, 'GB');

我们需要给谷歌电话库提供一个提示来说明这个号码是哪个国家的。你也可以改成你自己的国家。

我们把所有的这些打包在一个新的路由中:

$app->post('/identify-telephone-number', function(Request $request) use ($app) {    // Grab the uploaded file   $file = $request->files->get('upload');    // Extract some information about the uploaded file   $info = new SplFileInfo($file->getClientOriginalName());    // Create a quasi-random filename   $filename = sprintf('%d.%s', time(), $info->getExtension());    // Copy the file   $file->move(__DIR__.'/../uploads', $filename);    // Instantiate the Tessearct library   $tesseract = new TesseractOCR(__DIR__ . '/../uploads/' . $filename);    // Perform OCR on the uploaded image   $text = $tesseract->recognize();    $number = findPhoneNumber($text, 'GB');    return $app->json(     [       'number'     =>  $number,     ]   );  });

我们现在有简单的api的基础&mdash;-也就是JSON响应-&mdash;我们可以用来作为一个简单的移动应用的后端,这款应用可以用来从一幅图中添加联系人,打电话。

感谢各位的阅读,以上就是“PHP怎么从图像中读取文字”的内容了,经过本文的学习后,相信大家对PHP怎么从图像中读取文字这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是编程网,小编将为大家推送更多相关知识点的文章,欢迎关注!

--结束END--

本文标题: PHP怎么从图像中读取文字

本文链接: https://www.lsjlt.com/news/287229.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • PHP怎么从图像中读取文字
    这篇文章主要讲解了“PHP怎么从图像中读取文字”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“PHP怎么从图像中读取文字”吧!Tesseract是一个能实现OCR的开源项目。你能在*Nix系统...
    99+
    2023-06-17
  • Python中怎么从图像中读取文本
    本篇文章为大家展示了Python中怎么从图像中读取文本,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。OpenCV现在,这个库将只用于加载图像,实际上你不需要事先对它有太多了解(尽管它可能有帮助,你将...
    99+
    2023-06-16
  • VB.NET中怎么读取图像
    VB.NET中怎么读取图像,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。VB.NET读取图像代码示例:Public Function Get...
    99+
    2023-06-17
  • PHP怎么从txt文件中读取数据
    这篇文章主要介绍了PHP怎么从txt文件中读取数据,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。一、打开/关闭文件对文件操作时首先要打开文件,打开文件用 fopen()函数,...
    99+
    2023-06-29
  • 如何提高Android从文件中读取图像的效率
    本篇文章给大家分享的是有关如何提高Android从文件中读取图像的效率,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。方法一start_time = Syst...
    99+
    2023-05-31
    android roi %d
  • matlab怎么读取图像像素值
    在MATLAB中,可以使用`imread`函数来读取图像的像素值。该函数以字符串形式接受图像文件的路径作为输入参数,并返回一个矩阵,...
    99+
    2023-10-27
    matlab
  • php中怎么逐个字符读取文件
    这期内容当中小编将会给大家带来有关php中怎么逐个字符读取文件,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。设置字符编码。打开文件,判断文件是否打开成功。循环读取文件内容。关闭文件。header(&quo...
    99+
    2023-06-20
  • Python从图像中提取文本及其坐标
    Python从图像中提取文本及其坐标 在数字化时代,文本数据已经成为人们生活和工作中重要的数据形式。有时候我们需要从图片中提取文字信息,这就要用到Python编程语言中OCR技术的应用了。本文将介绍如...
    99+
    2023-09-06
    python 数学建模 开发语言
  • PHP中怎么读取文件
    本篇文章给大家分享的是有关PHP中怎么读取文件,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。< php  $file = '...
    99+
    2023-06-17
  • java怎么从文件读取数据
    在Java中,你可以使用`java.io`包中的`FileInputStream`或`BufferedReader`类来从文件中读取...
    99+
    2023-10-24
    java
  • PHP怎么快速从字符串中提取文件名
    本篇内容主要讲解“PHP怎么快速从字符串中提取文件名”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“PHP怎么快速从字符串中提取文件名”吧!本文的主题是快速从指定的字符串中提取文件名,首先大家要知...
    99+
    2023-06-20
  • VB.NET中怎么读取文件图标
    本篇文章给大家分享的是有关VB.NET中怎么读取文件图标,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。VB.NET读取文件中的图标的实现步骤启动Visual Studio .N...
    99+
    2023-06-17
  • 怎么在PHP中读取文件
    小编给大家分享一下怎么在PHP中读取文件,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!1.fread语法:fread  ( reso...
    99+
    2023-06-14
  • php怎么实现从第几位截取中文字符串
    本教程操作环境:windows7系统、PHP7.1版、DELL G3电脑在对字符串进行处理时,有时我们需要对字符串进行截取操作。在 PHP 中,截取字符串可以通过 PHP 的预定义函数 substr() 和mb_subst ...
    99+
    2020-08-13
    php 截取中文字符串
  • 如何在Linux上从图像和PDF中提取文本
    本篇内容介绍了“如何在Linux上从图像和PDF中提取文本”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!gImageReader是Tesse...
    99+
    2023-06-15
  • dotenv怎么从.env文件中读取环境变量
    这篇文章主要讲解了“dotenv怎么从.env文件中读取环境变量”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“dotenv怎么从.env文件中读取环境变量”吧!引言dotenv从.env文件...
    99+
    2023-07-04
  • java怎么从配置文件读取数据
    要从配置文件中读取数据,可以使用Java的Properties类。以下是一个示例代码:```javaimport java.io.F...
    99+
    2023-08-17
    java
  • tkinter怎么读取文本框中的数字
    你可以使用`get()`方法来获取文本框中的文本内容,然后使用`int()`函数将其转换为整数类型。下面是一个简单的例子:```py...
    99+
    2023-08-12
    tkinter
  • Java中怎么读取FileReader字符文件类
    今天就跟大家聊聊有关Java中怎么读取FileReader字符文件类,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。今天介绍字符文件的读取,分别用FileReaderFileReade...
    99+
    2023-06-17
  • Python怎么从csv文件中读取数据及提取数据
    本篇内容主要讲解“Python怎么从csv文件中读取数据及提取数据”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Python怎么从csv文件中读取数据及提取数据”吧!数据保存在csv文件中1.从...
    99+
    2023-06-25
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作