標籤:

圖片中的字元分割提取(基於opencv)

源圖片

像這些圖片的字元就比較好操作,每個字元都獨立,不連在一起,所以輪廓檢測最好了。所以就有:1.源圖片轉成單通道的灰階圖片2.對灰度圖像進行閾值操作得到二值圖像

(對於一些手機拍的,背景色不是純的話,可以用cvSmooth()平滑一下。)

二值化後的圖片

3.輪廓檢測(只獲取最外層的)4.遍歷所有檢測到的輪廓,用cvBoundingRect()得到每一個輪廓的外接矩形

找到的輪廓

5.摳它們出來,這步在上面的遍歷中直接通過setROI方法進行提取。

最後的結果

下面是源碼:

[cpp] view plaincopyprint?

  1. #include"stdafx.h"
  2. #include"cv.h"
  3. #include"highgui.h"
  4. #include"cxcore.h"
  5. intmain(intargc,char*argv[])
  6. {
  7. IplImage*imgSrc=cvLoadImage("D:\4.jpg",CV_LOAD_IMAGE_COLOR);
  8. IplImage*img_gray=cvCreateImage(cvGetSize(imgSrc),IPL_DEPTH_8U,1);
  9. cvCvtColor(imgSrc,img_gray,CV_BGR2GRAY);
  10. cvThreshold(img_gray,img_gray,100,255,CV_THRESH_BINARY_INV);//CV_THRESH_BINARY_INV使得背景為黑色,字元為白色,這樣找到的最外層才是字元的最外層
  11. cvShowImage("ThresholdImg",img_gray);
  12. CvSeq*contours=NULL;
  13. CvMemStorage*storage=cvCreateMemStorage(0);
  14. //上面源圖片有瑕疵可以用腐蝕,膨脹來祛除
  15. intcount=cvFindContours(img_gray,storage,&contours,sizeof(CvContour),CV_RETR_EXTERNAL);
  16. printf("輪廓個數:%d",count);
  17. intidx=0;
  18. charszName[56]={0};
  19. inttempCount=0;
  20. for(CvSeq*c=contours;c!=NULL;c=c->h_next){
  21. CvRectrc=cvBoundingRect(c,0);
  22. //if()
  23. //{
  24. //continue;這裡可以根據輪廓的大小進行篩選
  25. //}
  26. cvDrawRect(imgSrc,cvPoint(rc.x,rc.y),cvPoint(rc.x+rc.width,rc.y+rc.height),CV_RGB(255,0,0));
  27. IplImage*imgNo=cvCreateImage(cvSize(rc.width,rc.height),IPL_DEPTH_8U,3);
  28. cvSetImageROI(imgSrc,rc);
  29. cvCopyImage(imgSrc,imgNo);
  30. cvResetImageROI(imgSrc);
  31. sprintf(szName,"wnd_%d",idx++);
  32. cvNamedWindow(szName);
  33. cvShowImage(szName,imgNo);
  34. cvReleaseImage(&imgNo);
  35. }
  36. cvNamedWindow("src");
  37. cvShowImage("src",imgSrc);
  38. cvWaitKey(0);
  39. cvReleaseMemStorage(&storage);
  40. cvReleaseImage(&imgSrc);
  41. cvReleaseImage(&img_gray);
  42. cvDestroyAllWindows();
  43. return0;
  44. }
  45. theend!

推薦閱讀:

楹帖雜醬渣008(A之字元號重複式)
佛教里的萬字元到底是左旋還是右旋
一個字元串中文本與數字的拆分
玫瑰十字元號詳解

TAG:圖片 | 字元 |