lhMorpRankFilterB-二值图像等级滤波器
函数: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);
}