圖像識別中最貼近咱們生活的可能就是 OCR 技術了。 OCR 的定義:OCR (Optical Character Recognition,光學字符識別)是指電子設備(例如掃描儀或數碼相機)檢查紙上打印的字符,經過檢測暗、亮的模式肯定其形狀,而後用字符識別方法將形狀翻譯成計算機文字的過程。算法
今天就來簡單分析下 OCR 技術的原理。網絡
從總體上來講,OCR通常分爲兩個大步驟:圖像處理以及文字識別。函數
識別文字前,咱們要對原始圖片進行預處理,以便後續的特徵提取和學習。這個過程一般包含:灰度化、二值化、降噪、傾斜矯正、文字切分等子步驟。每個步驟都涉及了不一樣的算法。咱們如下面這張原始圖片爲例,進行每一個步驟的講解。學習
灰度化(gray processing),在RGB模型中,若是R=G=B時,則彩色表示一種灰度顏色,其中R=G=B的值叫灰度值,所以,灰度圖像每一個像素只需一個字節存放灰度值(又稱強度值、亮度值),灰度範圍爲0-255。說通俗一點,就是將一張彩色圖片變爲黑白圖片。優化
灰度化通常有份量法、最大值法、平均值法、加權平均法四種方法對彩色圖像進行灰度化。人工智能
一幅圖像包括目標物體、背景還有噪聲,要想從多值的數字圖像中直接提取出目標物體,最經常使用的方法就是設定一個閾值T,用T將圖像的數據分紅兩部分:大於T的像素羣和小於T的像素羣。這是研究灰度變換的最特殊的方法,稱爲圖像的二值化(binaryzation)。spa
二值化的黑白圖片不包含灰色,只有純白和純黑兩種顏色。翻譯
二值化裏最重要的就是閾值的選取,通常分爲固定閾值和自適應閾值。 比較經常使用的二值化方法則有:雙峯法、P參數法、迭代法和OTSU法等。設計
現實中的數字圖像在數字化和傳輸過程當中常受到成像設備與外部環境噪聲干擾等影響,稱爲含噪圖像或噪聲圖像。減小數字圖像中噪聲的過程稱爲圖像降噪(Image Denoising)。圖片
圖像中噪聲的來源有許多種,這些噪聲來源於圖像採集、傳輸、壓縮等各個方面。噪聲的種類也各不相同,好比椒鹽噪聲,高斯噪聲等,針對不一樣的噪聲有不一樣的處理算法。
在上一步獲得的圖像中能夠看到不少零星的小黑點,這就是圖像中的噪聲,會極大干擾到咱們程序對於圖片的切割和識別,所以咱們須要降噪處理。降噪在這個階段很是重要,降噪算法的好壞對特徵提取的影響很大。
圖像降噪的方法通常有均值濾波器、自適應維納濾波器、中值濾波器、形態學噪聲濾除器、小波去噪等。
對於用戶而言,拍照的時候不可能絕對的水平,因此,咱們須要經過程序將圖像作旋轉處理,來找一個認爲最可能水平的位置,這樣切出來的圖,纔有多是最好的一個效果。
傾斜矯正最經常使用的方法是霍夫變換,其原理是將圖片進行膨脹處理,將斷續的文字連成一條直線,便於直線檢測。計算出直線的角度後就能夠利用旋轉算法,將傾斜圖片矯正到水平位置。
對於一段多行文原本講,文字切分包含了行切分與字符切分兩個步驟,傾斜矯正是文字切分的前提。咱們將傾斜矯正後的文字投影到 Y軸,並將全部值累加,這樣就能獲得一個在y軸上的直方圖。
直方圖的谷底就是背景,峯值則是前景(文字)所在的區域。因而咱們就將每行文字的位置給識別出來了。
字符切分和行切分相似,只是此次咱們要將每行文字投影到 X軸。
但要注意的是,同一行的兩個字符每每挨的比較緊,有些時候會出現垂直方向上的重疊,投影的時候將他們認爲是一個字符,從而形成切割的時候出錯(多出如今英文字符);也有些時候同一個字符的左右結構在X軸的投影存在一個小間隙,切割的時候誤把一個字符切分爲兩個字符(多出如今中文字符)。因此相較於行切分,字符切分更難。
對於這種狀況,咱們能夠預先設定一個字符寬度的指望值,切出的字符若是投影超出指望值太大,則認爲是兩個字符;若是遠遠小於這個指望值,則忽略這個間隙,把間隙左右的「字符」合成一個字符來識別。
預處理完畢後,就到了文字識別的階段。這個階段會涉及一些人工智能方面的知識,比較抽象,無法用圖片表達,我儘可能講得簡單易懂一些。
特徵是用來識別文字的關鍵信息,每一個不一樣的文字都能經過特徵來和其餘文字進行區分。對於數字和英文字母來講,這個特徵提取是比較容易的,總共就 10 + 26 x 2 = 62 個字符,並且都是小字符集。對於漢字來講,特徵提取的難度就比較大了,由於首先漢字是大字符集;其次國標中光是最經常使用的第一級漢字就有3755個;最後漢字結構複雜,形近字多,特徵維度就比較大。
在肯定了使用何種特徵後,還有可能要進行特徵降維,這種狀況下,若是特徵的維數過高,分類器的效率會受到很大的影響,爲了提升識別速率,每每就要進行降維,這個過程也很重要,既要下降特徵維數,又得使得減小維數後的特徵向量還保留了足夠的信息量(以區分不一樣的文字)。
對一個文字圖像,提取出特徵,丟給分類器,分類器就對其進行分類,告訴你這個特徵該識別成哪一個文字。分類器的設計就是咱們的任務。分類器的設計方法通常有:模板匹配法、判別函數法、神經網絡分類法、基於規則推理法等,這裏不展開敘述。在進行實際識別前,每每還要對分類器進行訓練,這是一個監督學習的過程。成熟的分類器也有不少,有 SVM,CNN 等。
其實就是對於分類器的分類結果進行優化,這通常就要涉及天然語言理解的範疇了。
首先是形近字的處理:舉個栗子,「分」和「兮」形近,可是若是遇到「分數」這個詞語,就不該該識別爲「兮數」,由於「分數」纔是一個正常詞語。這須要經過語言模型來進行糾正。
其次是對於文字排版的處理:好比一些書籍是分左右兩欄的,同一行的左右兩欄不屬於同一句話,不存在任何語法上的聯繫。若是按照行切割,就會把左行的末尾和右行的開頭連在一塊兒,這是咱們不但願看到的,這樣的狀況須要進行特殊處理。
已有開源類庫:tesseract-ocr