原文地址:http://blog.csdn.net/binbin_sun/article/details/52295170前端
基於OCR的圖片字符識別可行性研究python
1:概述linux
紙張在許多地方已日益失寵,無紙化辦公談論40多年,辦公環境正限制紙山的生成。而過去幾年,無紙化辦公的概念發生了顯着的轉變。在計算機軟件的幫助下,包含大量重要管理數據和資訊的文檔能夠更方便的以電子形式儲存。掃描文檔的好處不純粹是存檔理由。爲了訪問基於紙張的信息和將信息整合進數字工做流,光學字符識別(OCR:Optical CharacterRecognition),相當重要。選擇正確的OCR工具要基於特定需求而定,例如在線OCR服務對某些人有用,但可能存在隱私問題和文件大小限制。 OCR軟件非大衆產品,所以開源替代相對於商業級重量級產品相對較少,再加上OCR軟件須要先進的算法將掃描的圖像正確翻譯成實際的文字,而圖像不只僅含有文字,它還包含佈局、圖形和表格,可能會跨越多頁。於是選擇合適的OCR軟件技術顯得十分重要,不只能極大的提升效率,同時可以開源節流,長遠看來是一項十分必須的工做。OCR,是一個可以將不一樣類型的文檔,如圖像文件,掃描文檔,圖片轉換爲可編輯文檔,從而使數據可搜索。讀取其中有用的文字信息,進而方便下一步處理。本文主要介紹OCR技術的相關步驟和一些OCR可行性方案。算法
2:OCR字符識別原理編程
OCR的基本原理就是經過掃描儀將一份文稿的圖像輸入給計算機,而後由計算機取出每一個文字的圖像,並將其轉換成漢字的編碼。其具體工做過程是,掃描儀將漢字文稿經過電荷耦合器件CCD將文稿的光信號轉換爲電信號,通過模擬/數字轉換器轉化爲數字信號傳輸給計算機。計算機接受的是文稿的數字圖像,其圖像上的漢字多是印刷漢字,也多是手寫漢字,而後對這些圖像中的漢字進行識別。對於印刷體字符,首先採用光學的方式將文檔資料轉換成原始黑白點陣的圖像文件,再經過識別軟件將圖像中的文字轉換成文本格式,以便文字處理軟件的進一步加工。其中文字識別是OCR的重要技術網絡
一般的字符處理步驟主要由如下幾個部分組成:數據結構
圖一:OCR字符識別步驟機器學習
(1)圖文輸入:文檔圖像的掃描質量是OCR軟件正確識別的前提條件。恰當地選擇掃描分辨率及相關參數,是保證文字清楚、特徵不丟失的關鍵。高質量的圖像文件能大大提升圖片字符識別率。文檔應儘量地放置端正,以保證預處理檢測的傾斜角小,在進行傾斜校訂後,文字圖像的變形就小。這些簡單的操做,會使系統的識別正確率有所提升。反之,因爲掃描設置不當,文字的斷筆過多可能會分檢出半個文字的圖像。文字斷筆和筆畫粘連會形成有些特徵丟失,在將其特徵與特徵庫比較時,會使其特徵距離加大,識別錯誤率上升編程語言
(2)預處理:預處理是指在進行文字識別以前的一些準備工做,包括圖像淨化處理,去掉原始圖像中的顯見噪聲(干擾)。主要任務是測量文檔放置的傾斜角,對文檔進行版面分析,對選出的文字域進行排版確認,對橫、豎排版的文字行進行切分,每一行的文字圖像的分離,標點符號的判別等。這一階段的工做很是重要,處理的效果直接影響到文字識別的準確率。對包含文字的圖像進行處理以便後續進行特徵提取、學習。這個過程的主要目的是減小圖像中的無用信息,以便方便後面的處理。在這個步驟一般有:灰度化(若是是彩色圖像)、降噪、二值化、字符切分以及歸一化這些子步驟。字符識別通過二值化後,圖像只剩下兩種顏色,即黑和白,其中一個是圖像背景,另外一個顏色就是要識別的文字了。降噪在這個階段很是重要,降噪算法的好壞對特徵提取的影響很大。字符切分則是將圖像中的文字分割成單個文字——識別的時候是一個字一個字識別的。若是文字行有傾斜的話每每還要進行傾斜校訂。歸一化則是將單個的文字圖像規整到一樣的尺寸,在同一個規格下,才能應用統一的算法。工具
(3)單字識別:單字識別是體現OCR文字識別的核心技術。從掃描文本中分檢出的文字圖像,由計算機將其圖形、圖像轉變成文字的標準代碼,是讓計算機「認字」的關鍵,也就是所謂的識別技術。要想讓計算機來識別文字,也須要先將文字的特徵等信息儲存到計算機裏,但要儲存什麼樣的信息及怎樣來獲取這些信息是一個很複雜的過程。在識別過程當中,提取特徵是重要的一步,這是決定識別文字正確與否的關鍵,每一個不一樣的文字都能經過特徵來和其餘文字進行區分。對於數字和英文字母來講,這個特徵提取是比較容易的,由於數字只有10個,英文字母只有52個,都是小字符集。對於漢字來講,特徵提取比較困難,由於首先漢字是大字符集,國標中光是最經常使用的第一級漢字就有3755個;第二個漢字結構複雜,形近字多。在肯定了使用何種特徵後,視狀況而定,還有可能要進行特徵降維,這種狀況就是若是特徵的維數過高(特徵通常用一個向量表示,維數即該向量的份量數),分類器的效率會受到很大的影響,爲了提升識別速率,每每就要進行降維,既要下降維數,同時使得減小維數後的特徵向量還保留了足夠的信息量(以區分不一樣的文字)。經常使用的特徵提取方法包括HOG,PCA等等。分類器主要用於識別,對一個文字圖像,提取出特徵後,送到分類器,分類器就對其進行分類,告訴你這個特徵該識別成哪一個文字。在進行實際識別前,每每還要對分類器進行訓練,這是一個監督學習的案例。一般狀況下,因爲具體狀況的不一樣,選擇的分類器也不同,常常會用到的分類器包括,SVM,KNN等等。
(4)後處理:後處理是指對識別出的文字或多個識別結果採用詞組方式進行上下匹配,即將單字識別的結果進行分詞,與詞庫中的詞組進行比較,以提升系統的識別率,減小誤識率。漢字字符識別是文字識別領域最爲困難的問題,它涉及模式識別、圖像處理、數字信號處理、天然語言理解、人工智能、模糊數學、信息論、計算機、中文信息處理等學科,是一門綜合性技術。
3:幾種經常使用的OCR字符識別解決方案
下面介紹幾種經常使用的OCR解決方案:
(1)Tesseract:Tesseract的OCR引擎最早由HP實驗室於1985年開始研發,至1995年時已經成爲OCR業內最準確的三款識別引擎之一。然而,HP不久便決定放棄OCR業務,Tesseract也今後塵封。多年以後,HP將其貢獻與開源軟件業。Tesseract目前已做爲開源項目發佈在Google Project。Tesseract做爲一個開源項目聽從Apache2.0協議。開發者可以直接使用其API接口,用於從圖像中提取打印,手寫信息。同時,它支持絕大多數語言。
(2)OCRopus:Ocropus(TM)是一個先進的文件分析和OCR系統,採用可插入的佈局分析,可插入的字符識別,天然語言統計建模和多語言支持功能。,若是須要使用,須要對圖片作一些預處理。OCRopus是爲Linux開發的,可是其在Mac os x 仍然得到不錯的應用。OCRopus主要應用於大批量文件轉換,還爲桌面及辦公使用。使用tesseract做爲其惟一的字符識別插件,自身的引擎在0.4版本。
(3)freeORC:freeOCR是一個一樣使用tesseract引擎的軟件。很是簡單,適用於多頁TIFF文件,傳真文件,和絕大多數圖像類型。其原有引擎tesseract沒法識別的一些壓縮的tiff文件,它能夠得到不錯效果。
(4)GOCR:GOCR一個OCR項目,其開發基於GNU公用協議。GOCR可被用在不一樣的前端,這使得其很是容易接入不一樣的操做系統。同時它能打開許多不一樣的圖像格式。其對含噪音圖片,角度變換,手寫體沒法得到較優結果。其最新一次更新在2013年.
(5) Cuneiform :Cuneiform 是一個 OCR 文字識別系統的商標,最開始是由Cognitive 技術所開發的運行在 Windows 下的軟件。而這個項目是該軟件在 Linux 系統下的移植版本。其受權協議爲:BSD,開發語言爲:C/C++。
上述的方案主要是基於現有系統,對不一樣的OCR任務進行優化。除此以外,如今基於深度學習的,CNN(卷積神經網絡)一樣能夠用來嘗試解決OCR問題。有項目使用CNN識別車牌上的中文,識別率一樣能夠得到不錯的效果。
以下表一是幾種解決方案的對比:
方案 |
協議 |
支持系統 |
編程語言 |
支持語言 |
備註 |
Tesseract |
Apache |
Widows,Mac,Linux |
C/C++ |
100+(含中文) |
使用者較多 |
OCRopus |
Apache |
Linux |
未知 |
|
|
freeORC |
GPL |
Windows |
C# |
23 |
|
GOCR |
GPL |
Widows,Mac,Linux |
C |
未知 |
|
Cuneiform |
BSD |
Widows,Mac,Linux |
C/C++ |
28 |
商業級系統,可識別複雜表格 |
表一:幾種解決方案的對比
4:結論及總結
針對字符識別,不一樣的狀況適用於不一樣方案。有時須要根據具體問題,將不一樣的算法結合以得到最優的識別結果。就識別發票而言,流程大致以下,首先且最重要的是得到清晰度足夠的高的圖片。同時圖片中發票的位置應儘可能一致。在進行識別過程當中,應有些是重要信息,即那些目標區域是或是目標信息須要識別的,依此,圖片將會進行分割。在目標區域,將會使用上述的一些方案進行字符識別。以後將識別結果進行輸出。其實無論字符識別應用於何種場景,最終的目的都是爲了準確的得到其目標信息。而在識別過程當中,目標信息不被不相干信息干擾則顯得尤其重要。這也是OCR技術須要解決的重點和難點。就綜合分析來看,Tesseract方案的可行性較高,能夠嘗試。
參考:
1:http://www.zhihu.com/question/20191727 知乎中相關介紹(侵刪)
2:wiki
ps:這是由於要接一個項目,是組長思密達讓我作的相關調查,因而便嘗試寫一下,可是實際上看,因爲大部分的方案都是開源的,部分識別率能夠說的上是慘不忍睹,特別是對中文字符的識別。因爲以後沒有作這個項目,因此就暫時告一段落了。若是有人有好的方案,也能夠推薦下,權當學習了!