這篇文章主要講解了“PHP怎么從圖像中讀取文字”,文中的講解內(nèi)容簡單清晰,易于學(xué)習(xí)與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學(xué)習(xí)“PHP怎么從圖像中讀取文字”吧!
成都創(chuàng)新互聯(lián)公司是一家專業(yè)提供和田企業(yè)網(wǎng)站建設(shè),專注與網(wǎng)站建設(shè)、成都做網(wǎng)站、H5開發(fā)、小程序制作等業(yè)務(wù)。10年已為和田眾多企業(yè)、政府機構(gòu)等服務(wù)。創(chuàng)新互聯(lián)專業(yè)網(wǎng)站制作公司優(yōu)惠進行中。
Tesseract是一個能實現(xiàn)OCR的開源項目。你能在*Nix系統(tǒng),Mac系統(tǒng)和Windows系統(tǒng)上運行這個項目,但是只要使用一個庫,我們就能在PHP項目中使用它了。本教程的目的是教你如何使用。
安裝
準備
為了讓事情變得簡單和一致的, 我們將使用虛擬機(本文使用Vagrant)來運行應(yīng)用程序,這會涉及到安裝PHP和Nginx,我們將安裝 Tesseract來分別演示過程。如果你想自己基于現(xiàn)有Debian-based系統(tǒng)安裝Tesseract,你可以跳過下一部分—或者查看the README來獲得在其他*nix上,Mac系統(tǒng)或者Windows的安裝指導(dǎo).
配置Vagrant
為了配置Vagrant以跟上本教程,完成如下步驟?;蛘吣阋部梢院唵蔚膹腉ithub獲得代碼。
輸入以下命令來下載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中有其他的操作系統(tǒng)對應(yīng)教程。
測試并定制安裝
我們將使用PHP包裝,但是之前我們可以在命令行測試Tesseract。
首先保存這個圖片sign.png
在虛擬機中,執(zhí)行如下命令來從圖片中讀取文字
tesseract sign.png out
這將在當(dāng)前文件夾創(chuàng)建一個文件:out.txt里面應(yīng)該有單詞:CAUTION
現(xiàn)在嘗試sign2.jpg
tesseract sign2.jpg out
這次產(chǎn)生單詞Einbahnstral’ie。很接近但不正確—雖然圖像中的文字相當(dāng)清晰,它沒能識別字符ß。
為了獲使Tesseract正常讀取字符串,我們需要安裝一些新的語言文件—就本例來說,德語。
這里有一個全面的可用語言文件列表,但我們直接下載所需的文件:
wget https://tesseract-ocr.googlecode.com/files/tesseract-ocr-3.02.deu.tar.gz
解壓:
tar zxvf tesseract-ocr-3.02.deu.tar.gz
然后把文件復(fù)制到如下目錄:
/usr/share/tesseract-ocr/tessdata
例如
cp deu-frak.traineddata /usr/share/tesseract-ocr/tessdata cp deu.traineddata /usr/share/tesseract-ocr/tessdata
現(xiàn)在我們再次執(zhí)行原來的命令但是要用 –l
tesseract sign2.jpg out -l deu “deu” 是德語的 ISO 639-3碼.
這次,文字應(yīng)該是Einbahnstraße(正確的)。
可以通過重復(fù)上述過程來使用任意語言。
配置應(yīng)用程序
我們將使用這個庫來用PHP使用Tesseract。
我們將建立一個極簡的web應(yīng)用:用戶上傳圖片,并查看OCR處理結(jié)果。我們將使用Silex microframework 來實現(xiàn)。不要擔(dān)心你不熟悉它,這個應(yīng)用本身很簡單。
記住這篇教程的所有代碼都能在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>
需要一個結(jié)果展示頁面(views\results.twig)::
<html> <head> <title>OCR</title> </head> <body> <h3>Results</h3> <textarea cols="50" rows="10">{{ text }}</textarea> <hr> <a href="/">← Go back</a> </body> </html>
現(xiàn)在建立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();
如果你在瀏覽器訪問這個應(yīng)用,你應(yīng)該能看到一個文件上傳表單。如果你在使用Homestead Improved Vagrant,你可以通過如下鏈接訪問該應(yīng)用。
http://homestead.app/
下一步是實現(xiàn)文件上傳。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);
如你所見,我們產(chǎn)生隨機文件名來減少文件名沖突—但在本應(yīng)用中,我們怎么命名文件是不重要的。一旦我們在本地有一份文件拷貝,我們就可以產(chǎn)生一個Tessearct庫的實例,然后進行分析:
// Instantiate the Tessearct library $tesseract = new TesseractOCR(__DIR__ . '/../uploads/' . $filename);
在圖像上實現(xiàn)OCR相當(dāng)簡單,我們只需調(diào)用方法recognize()。
// Perform OCR on the uploaded image $text = $tesseract->recognize();
***我們把結(jié)果展示到結(jié)果頁面:
return $app['twig']->render( 'results.twig', [ 'text' => $text, ] );
在一些圖片上嘗試,看看它效果怎樣。如果你有困難,可以參考這個
一個實際的例子
讓我們來看OCR一個更實用的例子。在本例中,我們嘗試在圖像中找到一個格式化的電話號碼。
看看下面一幅圖,上傳到你的應(yīng)用:
結(jié)果應(yīng)該如下:
:ii‘i Customer Service Helplines British Airways Helpline 09040 490 541
它沒有挑出正文文本,這是我們能料到的,因為圖片質(zhì)量太差。雖然識別了號碼但是也有一些“噪聲”。
為了提取相關(guān)信息,有如下幾件事我們可以做。
你可以讓Tesseract 把它的結(jié)果限制在一定的字符集內(nèi),所以我們告訴它只返回數(shù)字型的內(nèi)容代碼如下:
$tesseract->setWhitelist(range(0,9));
但這樣有個問題。它常常把非數(shù)字字符解釋成數(shù)字而非忽略它們。比如“Bob”可能被解釋稱數(shù)字“808”。
所以我們采用兩步處理。
嘗試提取可能是電話號碼的數(shù)字串。
用一個庫輪流評估每一個候選字符,一旦找到一個有效電話號碼則停止。
***步,我們可以用一個基本的正則表達式。可以用谷歌電話庫來確定一個數(shù)字串是否是合法電話號碼。
備注:我已在Sitepoint 寫過關(guān)于谷歌電話庫的內(nèi)容。
讓我們給谷歌電話庫添加一個PHP 端口,修改composer.json,添加:
"giggsey/libphonenumber-for-php": "~7.0"
別忘了升級:
composer update
現(xiàn)在我們可以寫一個函數(shù),輸入為一個字符串,嘗試提取一個合法的電話號碼
/** * Parse a string, trying to find a valid telephone number. As soon as it finds a * valid number, it'll return it in E1624 format. If it can't find any, it'll * simply return NULL. * * @param string $text The string to parse * @param string $country_code The two digit country code to use as a "hint" * @return string | NULL */ 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; }
希望注釋能解釋這個函數(shù)在干什么。注意如果這個庫沒能從字符串中解析出一個合法的電話號碼它會拋出一個異常。這不是什么問題;我們直接忽略它并繼續(xù)下一個候選字符。
如果我們找到一個電話號碼,我們以E.164的形式返回它。這提供了一個國際化的號碼,我們可以用來打電話或者發(fā)送SMS。
現(xiàn)在我們可以如下使用:
$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, ] ); });
我們現(xiàn)在有簡單的API的基礎(chǔ)—-也就是JSON響應(yīng)-—我們可以用來作為一個簡單的移動應(yīng)用的后端,這款應(yīng)用可以用來從一幅圖中添加聯(lián)系人,打電話。
感謝各位的閱讀,以上就是“PHP怎么從圖像中讀取文字”的內(nèi)容了,經(jīng)過本文的學(xué)習(xí)后,相信大家對PHP怎么從圖像中讀取文字這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是創(chuàng)新互聯(lián),小編將為大家推送更多相關(guān)知識點的文章,歡迎關(guān)注!
網(wǎng)站題目:PHP怎么從圖像中讀取文字
URL標題:http://www.rwnh.cn/article40/jisjho.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站導(dǎo)航、云服務(wù)器、營銷型網(wǎng)站建設(shè)、做網(wǎng)站、手機網(wǎng)站建設(shè)、Google
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)