lhMorpRankFilterB-二值图像等级滤波器

原始二值图像
lhMorpRankFilterB-二值图像等级滤波器 - 海水和火焰 - 视频监控 形态学 OpenCV
中值滤波和腐蚀效果:(9*9 RECT) 
lhMorpRankFilterB-二值图像等级滤波器 - 海水和火焰 - 视频监控 形态学 OpenCVlhMorpRankFilterB-二值图像等级滤波器 - 海水和火焰 - 视频监控 形态学 OpenCV
 

函数:lhMorpRankFilterB

说明:二值图像的形态学等级滤波,值得注意的是:腐蚀、膨胀、中值滤波是特殊的等级滤波

参数:

src 输入图像

dst 输出图像

se  结构元素(默认为3*3矩形)

rank 等级(默认为0时,rank取SE基数的中值,此时相当于中值滤波)

void lhMorpRankFilterB(const IplImage* src, IplImage* dst, IplConvKernel* se = NULL, unsigned int rank = 0)

{

       assert(src != NULL  &&  dst != NULL && src != dst );

       bool defaultse = false;

       int card;

       if (se == NULL)

       {

              card = 3*3;

              assert(rank >= 0 && rank <= card);

              se = cvCreateStructuringElementEx(3, 3, 1, 1, CV_SHAPE_RECT);

              defaultse = true;

       }

       else

       {

              card = lhMorpStructuringElementCard(se);

              assert(rank >= 0 && rank <= card);

       }

       //default rank is median

       if (rank == 0)

              rank = card/2+1;

       IplConvKernel* semap =  lhStructuringElementMap(se);

       CvMat *semat = cvCreateMat(semap->nRows, semap->nCols, CV_32FC1);

       int i;

       for (i=0; i<semap->nRows*semap->nCols; i++)

       {

              semat->data.fl[i] = semap->values[i];

       }

       cvThreshold(src, dst, 0, 1, CV_THRESH_BINARY);

       IplImage *temp = cvCreateImage(cvGetSize(dst), 8, 1);

       cvFilter2D(dst, temp, semat, cvPoint(semap->anchorX, semap->anchorY));

       cvThreshold(temp, dst, card-rank, 255, CV_THRESH_BINARY);

       cvReleaseMat(&semat);

       cvReleaseStructuringElement(&semap);

       if (defaultse)

              cvReleaseStructuringElement(&se);     

       cvReleaseImage(&temp);

}

posted on 2011-12-22 19:38  carekee  阅读(714)  评论(0编辑  收藏  举报