本文簡單介紹圖片字符識別的原理,主要識別圖片中的數字,其他字符識別原理類似。
大家應該知道,對於人類來說,可以很容易理解一張圖片所表達的信息,這是人類視覺系統數萬年演變進化的結果。但對於計算機這個誕生進化不到百年的 “新星”,要讓它理解一張圖像上的信息是一個復雜的過程。計算機理解圖像是一個數字計算比較的過程。
如圖,我們一目了然的識別的圖像中的數字,如何讓計算機識別下圖中的數字呢?
環境:VS2015+openCV3.4.0
要識別圖像字符,首先需要模版庫。對於識別簡單字符,可自己訓練,也可網上下載數據集。筆者這里就直接用提前做好的(用photoshop制作,字體和字大小盡量和待識別字符相近,不然影響識別率),為便於識別,模版名就以數字命名。
1. 圖片預處理。首先讀取待識別圖像,灰度化、二值化。
Mat srcImg = imread("H:\\test.jpg",CV_LOAD_IMAGE_GRAYSCALE);//打開圖片
灰度后圖像:
threshold(srcImg, srcImg, threshVal, 255, CV_THRESH_BINARY);//二值化
我們知道圖像本身就以數字進行存儲的,二值化后圖像就只有兩個值0和255.
例數字0:
注意二值化的閾值根據圖像實際情況進行調整。
二值化圖像后:
2. 圖像分割。我們需要將圖像中的字符分割開。整個過程分兩部,左右分割和上下分割。基本思想是,從圖像的左上角第一列開始,從左往右逐列掃描掃描,當遇到像素值為0時,記錄該列號sCol,繼續掃描再遇到整列像素值為255時,記錄列號eCol,sCol與eCol之間即為字符所在區間。復制二值圖該區域,這樣完成了左右分割;
將左右分割后,在此基礎上再對圖像進行上下分割,同理,從圖像左上角第一行,向下逐行掃描,當遇到像素值為255時,記錄該列號sRow,繼續掃描再遇到整列像素值為0時,記錄列號eRow,sRow與eRow之間即為字符所在區間。復制該區域,這樣完成了上下左右分割。
3. 識別。把切割后的數字圖片大小調整到和模板一樣的大小(一般以模版中最大尺寸),然后讓需要匹配的圖和別和10個模板相減(讓兩個圖片對應坐標像素點值相減),將所有差的絕對值求和 。
最后與哪個模板匹配時絕對值和最小,則就可以得到圖像與該模版最匹配,進而識別該字符。
4. 結果。
————————————————
版權聲明:本文為CSDN博主「ganwenbo2011」的原創文章,遵循CC 4.0 BY-SA版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/ganwenbo2011/article/details/80005288