图像识别去除孤立点方法

    技术2022-05-19  26

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

    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);

         }

    }

     


    最新回复(0)