今天我們簡單分析壹下OCR技術的原理,不會涉及具體的算法解釋和推導。畢竟每個算法都可以占很長篇幅,每個算法都可以重寫。
總的來說,OCR壹般分為兩大步驟:圖像處理和文本識別。
在識別字符之前,我們需要對原始圖像進行預處理,以便進行後續的特征提取和學習。這個過程通常包括:灰度化、二值化、降噪、傾斜校正、文本分割等子步驟。每壹步都涉及不同的算法。下面就以原圖為例來說明壹下每壹步。
灰度處理,在RGB模型中,如果R=G=B,color表示壹種灰色,其中R=G=B的值稱為灰度值,所以灰度圖像的每個像素只需要壹個字節來存儲灰度值(也叫強度值和亮度值),灰度範圍為0-255。說白了就是把彩色圖片變成黑白圖片。
壹般來說,彩色圖像灰度化有四種方法:分量法、最大值法、平均法和加權平均法。
圖像包括目標物體、背景和噪聲。從多值數字圖像中直接提取目標物體,最常用的方法是設置壹個閾值T,用T將圖像數據分為大於T的像素組和小於T的像素組兩部分..這是研究灰度變換最特殊的方法,稱為圖像二值化。
二值黑白圖片不含灰色,只有純白和純黑。
二值化最重要的是閾值的選擇,壹般分為固定閾值和自適應閾值。常用的二值化方法有:雙峰法、P參數法、叠代法和OTSU法。
現實中的數字圖像在數字化和傳輸過程中,往往會受到成像設備和外界環境的噪聲幹擾,稱為噪聲圖像或噪聲圖像。降低數字圖像中噪聲的過程稱為圖像去噪。
圖像中的噪聲有很多來源,來自於圖像的采集、傳輸、壓縮等各個方面。噪聲的類型也不同,如椒鹽噪聲、高斯噪聲等。不同的噪聲有不同的處理算法。
在上壹步得到的圖像中,我們可以看到很多零星的小黑點,這是圖像中的噪聲,會極大的幹擾我們程序對圖像的切割和識別,所以需要降噪。降噪在這個階段非常重要,降噪算法的好壞對特征提取有很大影響。
圖像去噪方法壹般包括均值濾波、自適應維納濾波、中值濾波、形態噪聲濾波、小波去噪等。
對於用戶來說,拍照時不可能做到絕對水平。所以我們需要通過程序旋轉圖像,找到壹個被認為是最水平的位置,這樣切割出來的圖像才能是最好的效果。
最常用的傾斜校正方法是Hough變換,其原理是將畫面展開,將斷續的字符連成壹條直線,便於直線檢測。在計算出直線的角度後,我們可以使用旋轉算法將傾斜的圖片校正到水平位置。
對於壹個多文本的文本,文本分割包括行分割和字符分割兩個步驟,而傾斜校正是文本分割的前提。我們將傾斜校正後的文本投影到Y軸上,累加所有的值,這樣就可以得到Y軸上的直方圖。
直方圖的底部是背景,峰值是前景(文本)所在的區域。所以我們確定了每壹行文字的位置。
字符分割類似於行分割,只是這次我們要將每行文本投影到X軸上。
但需要註意的是,同壹行中的兩個字符往往靠得很近,有時會出現垂直重疊。投影時會被當成壹個字符,導致切割錯誤(多為英文字符);有時同壹字符的左右結構在X軸上的投影有很小的間隙,切割時會把壹個字符錯分成兩個字符(多為漢字)。所以字符分割比行分割更難。
在這種情況下,我們可以預先設置壹個字符寬度的期望值,如果被切割字符的投影超過期望值太多,則認為是兩個字符;如果遠小於該期望值,則忽略該間隙,並將該間隙左右兩側的“字符”組合成壹個字符進行識別。
經過預處理後,就是字符識別階段。這個階段會涉及到壹些人工智能的知識,比較抽象,無法用圖片表達。我會盡量讓它簡單易懂。
特征是用來識別字符的關鍵信息,每個不同的字符都可以通過特征與其他字符區分開來。對於數字和英文字母,這個特征提取比較容易,總共* * *是10+26 x 2 = 52個字符,而且都是小字符集。對於漢字來說,特征提取的難度更大,因為首先漢字是大字符集;其次,國標中有3755個壹級漢字。最後,漢字結構復雜,相似字多,所以特征維數比較大。
確定要使用的特征後,可能有必要減小特征的尺寸。在這種情況下,如果特征的維數過高,分類器的效率會受到很大影響。為了提高識別率,往往需要降維。這個過程也很重要,不僅要降低特征維數,還要讓降維後的特征向量保留足夠的信息(區分不同的字符)。
對於壹個文本圖像,把特征提取出來扔給分類器,分類器會對它進行分類,告訴妳這個特征應該被識別為哪個文本。分類器的設計是我們的任務。分類器的設計方法壹般有:模板匹配法、判別函數法、神經網絡分類法、基於規則的推理法等等,這裏不做描述。在實際識別之前,往往需要訓練分類器,這是壹個有監督學習的過程。有許多成熟的分類器,如SVM和CNN。
其實就是優化分類器的分類結果,壹般涉及到自然語言理解的範疇。
首先是相似字的處理:比如“分”和“xi”這兩個字,形狀相似,但如果遇到“分數”這兩個字,就不要認成“xi數”,因為“分數”是壹個正常的字。這需要通過語言模型來糾正。
其次是文字排版的處理:比如有的書分左右兩欄,同壹行的左右兩欄不屬於同壹個句子,沒有語法聯系。如果按線切割,會把左線的末端和右線的起點連接起來,這是我們不願意看到的。這種情況需要特殊對待。
這是OCR的壹般原理。總的來說,OCR的步驟比較多,涉及的算法比較復雜。對於每壹步,每壹個算法都有很多單獨的研究論文,無法在本文中深入討論。如果從零開始做OCR,那將是壹個巨大的工程。我只是有點懵懂,在模式識別和機器學習的初級階段。如有錯誤,請指正。