//清除图像中的小区域(噪音)
//返回清除的小区域的个数
int CImageProc::CleanFragments(CVisImage &srcBI, CVisImage &dstBI, int fragment_size, bool bWhite)
{
int count_fragment = 0;
IplImage* src = srcBI.GetImage();
dstBI.CloneImage(srcBI);
IplImage* dst = dstBI.GetImage();
if(src)
{
CvMemStorage* storage = cvCreateMemStorage(0);
CvSeq* contour = 0;
//must be binary (black-n-white) image
if (bWhite) {
cvThreshold(src, dst, 128.0, 255, CV_THRESH_BINARY );//make the white area as the foreground
}
else {
cvThreshold(src, dst, 128.0, 255, CV_THRESH_BINARY_INV );//make the black area as the foreground
}
#ifdef SZP_DBG
//cvMorphologyEx( dst, dst, 0, 0, CV_MOP_CLOSE, 2 );//减轻锯齿
cvNamedWindow( "Source", 1 );
cvShowImage( "Source", src );
cvNamedWindow( "dst", 1 );
cvShowImage( "dst", dst );
#endif
cvFindContours( dst, storage, &contour, sizeof(CvContour), CV_RETR_LIST, CV_CHAIN_APPROX_SIMPLE );
cvZero( dst );