图像识别去除孤立点方法

来源:互联网 发布:天才白痴梦寓意知乎 编辑:程序博客网 时间:2024/05/01 00:41

在图像识别时,如果一些孤立的噪声点在识别字符附近,将会影响识别的正确性,现在介绍怎样去除这样的孤立点。

1.       原图像,圈内为噪声点。

 

2.       边缘检测

 

 

3.       提取识别点矩形

 

4.       对矩形面积小于一定阈值的认为是噪声点,并对其区域内的像素值改为背景色。

 

5.       处理后图像

 

6.       代码

 

void CImageOCRDlg::SmoothImage(char* strFileName)

{

     //去孤立小点

     const int NOISE_MAX_AREA=100;//噪声点最大值,像素

     const int CONTOUR_MAX_AREA=800; //数字矩形一般为19*55

 

     const int MAXCHARCOUNT=20;  //最多矩形的个数

     int intRealCharCount=0;

     IplImage* src;

     IplImage* dst;

     IplImage* tmpsrc1;

     IplImage* tmpsrc2;

     IplImage* tmpsrc3;

 

     if((src=cvLoadImage(strFileName,0))!= 0)

     {

 

         dst=cvCloneImage(src);

         tmpsrc1=cvCloneImage(src);

         tmpsrc2 = cvCreateImage( cvGetSize(tmpsrc1), 8,3 );

         cvZero(tmpsrc2 );

         tmpsrc3 = cvCreateImage( cvGetSize(tmpsrc1), 8,3 );

         cvZero(tmpsrc3);

         cvNot(tmpsrc3,tmpsrc3); //取反,使全白

         //去噪声

         cvSmooth(tmpsrc1,tmpsrc1,CV_MEDIAN,3,3,0);    

 

         //边缘检测

         cvCanny(tmpsrc1, tmpsrc1, 50, 150, 3);

 

 

 

         //画矩形

         CvMemStorage* storage = cvCreateMemStorage(0);

         CvSeq* contour = 0;

         //二值化图像

         cvThreshold( tmpsrc1, tmpsrc1, 1, 255, CV_THRESH_BINARY );

 

         cvFindContours( tmpsrc1, storage, &contour, sizeof(CvContour), CV_RETR_EXTERNAL, CV_CHAIN_APPROX_SIMPLE );

         for(;contour;contour=contour->h_next)

         {

              CvRect r=((CvContour*)contour)->rect;

 

              if(r.width*r.height <NOISE_MAX_AREA)

              {

                   CvScalar s1;

                   for(int i=r.y;i<r.y+r.height ;i++)

                   {

                       for(int j=r.x;j<r.x+r.width ;j++)

                       {

                            s1=cvGet2D(tmpsrc3,i,j);

                            cvSet2D(dst,i,j,s1);

                       }

                   }

              }

              if(r.height*r.width>CONTOUR_MAX_AREA)

              {

                   cvRectangle(tmpsrc2,cvPoint(r.x,r.y),cvPoint(r.x+r.width ,r.y+r.height),CV_RGB(255,0,0),1,CV_AA,0);

              }

         }

 

         //cvNamedWindow( "dst", 1 );

         //cvShowImage( "dst", dst );

        

 

         cvSaveImage(strFileName,dst);

         cvReleaseImage(&src);

         cvReleaseImage(&tmpsrc1);

         cvReleaseImage(&tmpsrc2);

         cvReleaseImage(&tmpsrc3);

     }

}

 

原创粉丝点击