自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

PHP OCR實(shí)戰(zhàn):用Tesseract從圖像中讀取文字

開發(fā) 后端
Tesseract是一個(gè)能實(shí)現(xiàn)OCR的開源項(xiàng)目。你能在*Nix系統(tǒng),Mac系統(tǒng)和Windows系統(tǒng)上運(yùn)行這個(gè)項(xiàng)目,但是只要使用一個(gè)庫,我們就能在PHP項(xiàng)目中使用它了。本教程的目的是教你如何使用。

Optical Character Recognition (OCR)即光學(xué)字符辨識(shí)是把打印文本轉(zhuǎn)換成一個(gè)數(shù)字表示的過程。它有各種各樣的實(shí)際應(yīng)用–從數(shù)字化印刷書籍、創(chuàng)建收據(jù)的電子記錄,到車牌識(shí)別甚至破解基于圖像的驗(yàn)證碼。

Robotic eye

Tesseract是一個(gè)能實(shí)現(xiàn)OCR的開源項(xiàng)目。你能在*Nix系統(tǒng),Mac系統(tǒng)和Windows系統(tǒng)上運(yùn)行這個(gè)項(xiàng)目,但是只要使用一個(gè)庫,我們就能在PHP項(xiàng)目中使用它了。本教程的目的是教你如何使用。

安裝

準(zhǔn)備

為了讓事情變得簡(jiǎn)單和一致的, 我們將使用虛擬機(jī)(本文使用Vagrant)來運(yùn)行應(yīng)用程序,這會(huì)涉及到安裝PHP和Nginx,我們將安裝 Tesseract來分別演示過程。如果你想自己基于現(xiàn)有Debian-based系統(tǒng)安裝Tesseract,你可以跳過下一部分—或者查看the README來獲得在其他*nix上,Mac系統(tǒng)或者Windows的安裝指導(dǎo).

配置Vagrant

為了配置Vagrant以跟上本教程,完成如下步驟。或者你也可以簡(jiǎn)單的從Github獲得代碼。

輸入以下命令來下載Homestead Improved Vagrant配置到一個(gè)名為orc的文件夾:

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

將Nginx配置文件Homestead.yml中的以下代碼:

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

修改成:

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

同樣要在hosts文件中添加

  1. 192.168.10.10       homestead.app 

安裝Tesseract

下一步是安裝Tesseract

因?yàn)镠omestead Improved 使用debian,我們可以在使用vagrant ssh登陸虛擬機(jī)后使用apt-get 來安裝它,簡(jiǎn)單運(yùn)行如下命令:

  1. sudo apt-get install tesseract-ocr 

正如上文提到的,在the README中有其他的操作系統(tǒng)對(duì)應(yīng)教程。

測(cè)試并定制安裝

我們將使用PHP包裝,但是之前我們可以在命令行測(cè)試Tesseract。

首先保存這個(gè)圖片sign.png

在虛擬機(jī)中,執(zhí)行如下命令來從圖片中讀取文字

 

  1. tesseract sign.png out 

這將在當(dāng)前文件夾創(chuàng)建一個(gè)文件:out.txt里面應(yīng)該有單詞:CAUTION

現(xiàn)在嘗試sign2.jpg

  1. tesseract sign2.jpg out 

這次產(chǎn)生單詞Einbahnstral’ie。很接近但不正確—雖然圖像中的文字相當(dāng)清晰,它沒能識(shí)別字符ß。

為了獲使Tesseract正常讀取字符串,我們需要安裝一些新的語言文件—就本例來說,德語。

這里有一個(gè)全面的可用語言文件列表,但我們直接下載所需的文件:

  1. wget https://tesseract-ocr.googlecode.com/files/tesseract-ocr-3.02.deu.tar.gz 

解壓:

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

然后把文件復(fù)制到如下目錄:

  1. /usr/share/tesseract-ocr/tessdata 

例如

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

現(xiàn)在我們?cè)俅螆?zhí)行原來的命令但是要用 –l

 

  1. tesseract sign2.jpg out -l deu 
  2.  
  3.     “deu” 是德語的 ISO 639-3碼. 

這次,文字應(yīng)該是Einbahnstraße(正確的)。

可以通過重復(fù)上述過程來使用任意語言。

配置應(yīng)用程序

我們將使用這個(gè)庫來用PHP使用Tesseract。

我們將建立一個(gè)極簡(jiǎn)的web應(yīng)用:用戶上傳圖片,并查看OCR處理結(jié)果。我們將使用Silex microframework 來實(shí)現(xiàn)。不要擔(dān)心你不熟悉它,這個(gè)應(yīng)用本身很簡(jiǎn)單。

記住這篇教程的所有代碼都能在Github上獲得。

***步是用Composer來安裝依賴文件:

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

然后建立三個(gè)文件夾:

  1. public 
  2. - uploads 
  3. - views 

我們需要上傳表單(views\index.twig):

  1. <html> 
  2.   <head> 
  3.     <title>OCR</title> 
  4.   </head> 
  5.   <body> 
  6.  
  7.     <form action="" method="post" enctype="multipart/form-data"
  8.       <input type="file" name="upload"
  9.       <input type="submit"
  10.     </form> 
  11.  
  12.   </body> 
  13. </html> 

需要一個(gè)結(jié)果展示頁面(views\results.twig)::

  1. <html> 
  2.   <head> 
  3.     <title>OCR</title> 
  4.   </head> 
  5.   <body> 
  6.  
  7.     <h2>Results</h2> 
  8.  
  9.     <textarea cols="50" rows="10">{{ text }}</textarea> 
  10.  
  11.     <hr> 
  12.  
  13.     <a href="/">← Go back</a> 
  14.  
  15.   </body> 
  16. </html> 

現(xiàn)在建立skeleton Silex app (public\index.php):

  1. <php 
  2.  
  3. require __DIR__.'/../vendor/autoload.php'
  4.  
  5. use Symfony\Component\HttpFoundation\Request; 
  6.  
  7. $app = new Silex\Application(); 
  8.  
  9. $app->register(new Silex\Provider\TwigServiceProvider(), [ 
  10.   'twig.path' => __DIR__.'/../views'
  11. ]); 
  12.  
  13. $app['debug'] = true; 
  14.  
  15. $app->get('/'function() use ($app) { 
  16.  
  17.   return $app['twig']->render('index.twig'); 
  18.  
  19. }); 
  20.  
  21. $app->post('/'function(Request $requestuse ($app) { 
  22.  
  23.     // TODO 
  24.  
  25. }); 
  26.  
  27. $app->run(); 

如果你在瀏覽器訪問這個(gè)應(yīng)用,你應(yīng)該能看到一個(gè)文件上傳表單。如果你在使用Homestead Improved Vagrant,你可以通過如下鏈接訪問該應(yīng)用。

 

  1. http://homestead.app/ 

下一步是實(shí)現(xiàn)文件上傳。Silex使得這項(xiàng)工作非常簡(jiǎn)單;$request包含一個(gè)files組件,我們可以通過它來獲得任意上傳的文件,代碼:

  1. // Grab the uploaded file 
  2. $file = $request->files->get('upload'); 
  3.  
  4. // Extract some information about the uploaded file 
  5. $info = new SplFileInfo($file->getClientOriginalName()); 
  6.  
  7. // Create a quasi-random filename 
  8. $filename = sprintf('%d.%s', time(), $info->getExtension()); 
  9.  
  10. // Copy the file 
  11. $file->move(__DIR__.'/../uploads'$filename); 

如你所見,我們產(chǎn)生隨機(jī)文件名來減少文件名沖突—但在本應(yīng)用中,我們?cè)趺疵募遣恢匾?。一旦我們?cè)诒镜赜幸环菸募截悾覀兙涂梢援a(chǎn)生一個(gè)Tessearct庫的實(shí)例,然后進(jìn)行分析:

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

在圖像上實(shí)現(xiàn)OCR相當(dāng)簡(jiǎn)單,我們只需調(diào)用方法recognize()。

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

***我們把結(jié)果展示到結(jié)果頁面:

  1. return $app['twig']->render( 
  2.     'results.twig'
  3.     [ 
  4.         'text'  =>  $text
  5.     ] 
  6. ); 

在一些圖片上嘗試,看看它效果怎樣。如果你有困難,可以參考這個(gè)

一個(gè)實(shí)際的例子

讓我們來看OCR一個(gè)更實(shí)用的例子。在本例中,我們嘗試在圖像中找到一個(gè)格式化的電話號(hào)碼。

看看下面一幅圖,上傳到你的應(yīng)用:

結(jié)果應(yīng)該如下:

  1. :ii‘i 
  2. Customer Service Helplines 
  3.  
  4. British Airways Helpline 
  5.  
  6. 09040 490 541 

它沒有挑出正文文本,這是我們能料到的,因?yàn)閳D片質(zhì)量太差。雖然識(shí)別了號(hào)碼但是也有一些“噪聲”。

為了提取相關(guān)信息,有如下幾件事我們可以做。

你可以讓Tesseract 把它的結(jié)果限制在一定的字符集內(nèi),所以我們告訴它只返回?cái)?shù)字型的內(nèi)容代碼如下:

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

但這樣有個(gè)問題。它常常把非數(shù)字字符解釋成數(shù)字而非忽略它們。比如“Bob”可能被解釋稱數(shù)字“808”。

所以我們采用兩步處理。

  1. 嘗試提取可能是電話號(hào)碼的數(shù)字串。

  2. 用一個(gè)庫輪流評(píng)估每一個(gè)候選字符,一旦找到一個(gè)有效電話號(hào)碼則停止。

***步,我們可以用一個(gè)基本的正則表達(dá)式??梢杂?a target="_blank" >谷歌電話庫來確定一個(gè)數(shù)字串是否是合法電話號(hào)碼。

備注:我已在Sitepoint 寫過關(guān)于谷歌電話庫的內(nèi)容。

讓我們給谷歌電話庫添加一個(gè)PHP 端口,修改composer.json,添加:

  1. "giggsey/libphonenumber-for-php""~7.0" 

別忘了升級(jí):

  1. composer update 

現(xiàn)在我們可以寫一個(gè)函數(shù),輸入為一個(gè)字符串,嘗試提取一個(gè)合法的電話號(hào)碼

  1. /** 
  2. * Parse a string, trying to find a valid telephone number. As soon as it finds a 
  3. * valid number, it'll return it in E1624 format. If it can't find any, it'll 
  4. * simply return NULL. 
  5. * 
  6. * @param  string   $text           The string to parse 
  7. * @param  string   $country_code   The two digit country code to use as a "hint" 
  8. * @return string | NULL 
  9. */ 
  10. function findPhoneNumber($text$country_code = 'GB') { 
  11.  
  12.   // Get an instance of Google's libphonenumber 
  13.   $phoneUtil = \libphonenumber\PhoneNumberUtil::getInstance(); 
  14.  
  15.   // Use a simple regular expression to try and find candidate phone numbers 
  16.   preg_match_all('/(\+\d+)?\s*(\(\d+\))?([\s-]?\d+)+/'$text$matches); 
  17.  
  18.   // Iterate through the matches 
  19.   foreach ($matches as $match) { 
  20.  
  21.     foreach ($match as $value) { 
  22.  
  23.       try { 
  24.  
  25.         // Attempt to parse the number 
  26.         $number = $phoneUtil->parse(trim($value), $country_code);    
  27.  
  28.         // Just because we parsed it successfully, doesn't make it vald - so check it 
  29.         if ($phoneUtil->isValidNumber($number)) { 
  30.  
  31.           // We've found a telephone number. Format using E.164, and exit 
  32.           return $phoneUtil->format($number, \libphonenumber\PhoneNumberFormat::E164); 
  33.  
  34.         } 
  35.  
  36.       } catch (\libphonenumber\NumberParseException $e) { 
  37.  
  38.         // Ignore silently; getting here simply means we found something that isn't a phone number 
  39.  
  40.       } 
  41.  
  42.     } 
  43.   } 
  44.  
  45.   return null; 
  46.  

希望注釋能解釋這個(gè)函數(shù)在干什么。注意如果這個(gè)庫沒能從字符串中解析出一個(gè)合法的電話號(hào)碼它會(huì)拋出一個(gè)異常。這不是什么問題;我們直接忽略它并繼續(xù)下一個(gè)候選字符。

如果我們找到一個(gè)電話號(hào)碼,我們以E.164的形式返回它。這提供了一個(gè)國際化的號(hào)碼,我們可以用來打電話或者發(fā)送SMS。

現(xiàn)在我們可以如下使用:

  1. $text = $tesseract->recognize(); 
  2. $number = findPhoneNumber($text'GB'); 

我們需要給谷歌電話庫提供一個(gè)提示來說明這個(gè)號(hào)碼是哪個(gè)國家的。你也可以改成你自己的國家。

我們把所有的這些打包在一個(gè)新的路由中:

  1. $app->post('/identify-telephone-number'function(Request $requestuse ($app) { 
  2.  
  3.   // Grab the uploaded file 
  4.   $file = $request->files->get('upload'); 
  5.  
  6.   // Extract some information about the uploaded file 
  7.   $info = new SplFileInfo($file->getClientOriginalName()); 
  8.  
  9.   // Create a quasi-random filename 
  10.   $filename = sprintf('%d.%s', time(), $info->getExtension()); 
  11.  
  12.   // Copy the file 
  13.   $file->move(__DIR__.'/../uploads'$filename); 
  14.  
  15.   // Instantiate the Tessearct library 
  16.   $tesseract = new TesseractOCR(__DIR__ . '/../uploads/' . $filename); 
  17.  
  18.   // Perform OCR on the uploaded image 
  19.   $text = $tesseract->recognize(); 
  20.  
  21.   $number = findPhoneNumber($text'GB'); 
  22.  
  23.   return $app->json( 
  24.     [ 
  25.       'number'     =>  $number
  26.     ] 
  27.   ); 
  28.  
  29. }); 

我們現(xiàn)在有簡(jiǎn)單的API的基礎(chǔ)—-也就是JSON響應(yīng)-—我們可以用來作為一個(gè)簡(jiǎn)單的移動(dòng)應(yīng)用的后端,這款應(yīng)用可以用來從一幅圖中添加聯(lián)系人,打電話。

總結(jié)

OCR有許多應(yīng)用——并且很容易整合進(jìn)你的應(yīng)用(超過你的預(yù)期)。本文中,我們安裝了開源OCR包;并使用一個(gè)包裝器庫,把它整合進(jìn)一個(gè)非常簡(jiǎn)單的PHP應(yīng)用。我們只是觸及到了所有可能性的表面,希望這能給你一些想法,幫你想想怎么在你自己的應(yīng)用中使用OCR。

譯文鏈接:http://www.codeceo.com/article/php-ocr-tesseract-get-text.html
英文原文:OCR in PHP: Read Text from Images with Tesseract

 

 

責(zé)任編輯:王雪燕 來源: 碼農(nóng)網(wǎng)
相關(guān)推薦

2021-04-09 20:49:44

PythonOCR圖像

2015-07-09 13:58:28

tesseract教程OCR教程

2023-10-10 08:22:12

Tesseract庫開源

2010-09-09 16:17:10

PHPXMLXML DOM

2020-01-10 22:56:56

Python圖像處理Linux

2024-09-09 00:00:00

2023-04-28 10:31:54

Linux命令圖像

2024-06-07 11:24:20

2022-11-16 14:05:06

Tesseract應(yīng)用調(diào)用

2011-07-07 17:30:25

iPhone Xcode

2017-09-21 15:43:02

深度序列學(xué)習(xí)

2023-09-27 08:51:52

PythonOCR技術(shù)

2024-01-11 11:35:46

Python開發(fā)

2010-05-28 16:04:03

讀取MySQL數(shù)據(jù)庫

2013-12-09 09:57:37

2009-12-04 17:31:32

PHP編碼轉(zhuǎn)換

2011-07-15 14:29:44

PHPXML

2011-06-07 13:44:40

VC

2012-06-12 15:43:22

PHP

2019-12-03 17:41:27

銀行卡OCR圖像處理
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)