tesseract识别图片中文字(一)
??一、對于復雜背景中的文本提取
?我測試用的簡單的單行文本,如果非文本區(qū)多對二值化影響大,首先進行提取文本行,再對提取的文本行進行二值化。
實例圖片:
圖片中的文字區(qū)域從此視頻幀中提取:
1、切取圖片中的行
????? 提取邊緣信息,邊緣圖像進行水平投影,將每一行中的像素值相加,得到一個每行邊緣信息的數組,
求數組的波谷,兩個波谷直接的區(qū)間就為文本行。
???? 求取波谷,我也沒想到什么好的算法,因為數組是有波動的,只提取極小值也不對,會提取到特別多個波谷。
?下一步想平滑后求極小值。
目前切行后為:
?
2、對文本行歸一化到一定的高
????? 按原來的寬高比對圖片進行縮放,縮放到高為80個像素點(看論文里的經驗值),便于文本的識別。
?
float ratioWH = (float)(image->width)/image->height;CvSize cv;cv.height = 80;//將文字行比例轉換為高80cv.width = 80*ratioWH;IplImage *norImage = cvCreateImage(cv,8,1);cvResize(image,norImage);3、對歸一化的文本行進行二值化
????? 提取歸一化文本行的邊緣信息,因為文本現在占圖像的主體,邊緣點的特征跟文本的特征比較相似(對于漸變文本,邊緣和
填充不一致的也沒有考慮,只考慮簡單的文本顏色比較單調的),根據邊緣點的位置在歸一化圖上提取相應點的顏色特征,
在這里我又加了連通域分析,不過感覺沒有什么改變。
IplImage *cannyImage = cvCreateImage(cvGetSize(norImage),8,1);cvCanny(norImage,cannyImage,50,150);CvMemStorage *pStor = cvCreateMemStorage(0);///創(chuàng)建目標輪廓存儲空間;CvSeq *pCont = NULL;///無需釋放內存cvFindContours(cannyImage, pStor, &pCont,sizeof(CvContour), CV_RETR_CCOMP, CV_CHAIN_APPROX_SIMPLE);//獲取二值圖像輪廓信息cvDrawContours(cannyImage,pCont,cvScalarAll(255),cvScalarAll(255),0,CV_FILLED,8, cvPoint(0, 0));int sum = 0;int num = 0;for(int i=0;i<norImage->height;i++){for(int j=0;j<norImage->width;j++){uchar data = *(cannyImage->imageData+i*cannyImage->widthStep+j);if(data!=0){uchar data2 = *(norImage->imageData+i*norImage->widthStep+j);sum += data2;num++;}}}//二值化float average =(float)(sum)/num;for(int i=0;i<norImage->height;i++){for(int j=0;j<norImage->width;j++){if((uchar)*(norImage->imageData+i*norImage->widthStep+j)>average){*(norImage->imageData+i*norImage->widthStep+j) = 255;}else{*(norImage->imageData+i*norImage->widthStep+j) = 0;}}}
二值化后圖片:
?
背景還是有沒有去掉的,根據上視頻幀是曝光的原因,考慮均衡一下。
4、然后用二值化的圖片再用tesseract識別。
http://blog.csdn.net/kuaile123/article/details/9302949
總結
以上是生活随笔為你收集整理的tesseract识别图片中文字(一)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Tesseract使用日记
- 下一篇: Tesseract-OCR 字符识别-样