圖片中的字元分割提取(基於opencv)
08-01
源圖片
像這些圖片的字元就比較好操作,每個字元都獨立,不連在一起,所以輪廓檢測最好了。所以就有:1.源圖片轉成單通道的灰階圖片2.對灰度圖像進行閾值操作得到二值圖像
(對於一些手機拍的,背景色不是純的話,可以用cvSmooth()平滑一下。)
二值化後的圖片
3.輪廓檢測(只獲取最外層的)4.遍歷所有檢測到的輪廓,用cvBoundingRect()得到每一個輪廓的外接矩形
找到的輪廓
5.摳它們出來,這步在上面的遍歷中直接通過setROI方法進行提取。
最後的結果
下面是源碼:
[cpp] view plaincopyprint?- #include"stdafx.h"
- #include"cv.h"
- #include"highgui.h"
- #include"cxcore.h"
- intmain(intargc,char*argv[])
- {
- IplImage*imgSrc=cvLoadImage("D:\4.jpg",CV_LOAD_IMAGE_COLOR);
- IplImage*img_gray=cvCreateImage(cvGetSize(imgSrc),IPL_DEPTH_8U,1);
- cvCvtColor(imgSrc,img_gray,CV_BGR2GRAY);
- cvThreshold(img_gray,img_gray,100,255,CV_THRESH_BINARY_INV);//CV_THRESH_BINARY_INV使得背景為黑色,字元為白色,這樣找到的最外層才是字元的最外層
- cvShowImage("ThresholdImg",img_gray);
- CvSeq*contours=NULL;
- CvMemStorage*storage=cvCreateMemStorage(0);
- //上面源圖片有瑕疵可以用腐蝕,膨脹來祛除
- intcount=cvFindContours(img_gray,storage,&contours,sizeof(CvContour),CV_RETR_EXTERNAL);
- printf("輪廓個數:%d",count);
- intidx=0;
- charszName[56]={0};
- inttempCount=0;
- for(CvSeq*c=contours;c!=NULL;c=c->h_next){
- CvRectrc=cvBoundingRect(c,0);
- //if()
- //{
- //continue;這裡可以根據輪廓的大小進行篩選
- //}
- cvDrawRect(imgSrc,cvPoint(rc.x,rc.y),cvPoint(rc.x+rc.width,rc.y+rc.height),CV_RGB(255,0,0));
- IplImage*imgNo=cvCreateImage(cvSize(rc.width,rc.height),IPL_DEPTH_8U,3);
- cvSetImageROI(imgSrc,rc);
- cvCopyImage(imgSrc,imgNo);
- cvResetImageROI(imgSrc);
- sprintf(szName,"wnd_%d",idx++);
- cvNamedWindow(szName);
- cvShowImage(szName,imgNo);
- cvReleaseImage(&imgNo);
- }
- cvNamedWindow("src");
- cvShowImage("src",imgSrc);
- cvWaitKey(0);
- cvReleaseMemStorage(&storage);
- cvReleaseImage(&imgSrc);
- cvReleaseImage(&img_gray);
- cvDestroyAllWindows();
- return0;
- }
- theend!
推薦閱讀:
※楹帖雜醬渣008(A之字元號重複式)
※佛教里的萬字元到底是左旋還是右旋
※一個字元串中文本與數字的拆分
※玫瑰十字元號詳解