在图像识别时,如果一些孤立的噪声点在识别字符附近,将会影响识别的正确性,现在介绍怎样去除这样的孤立点。
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);
}
}