图像中值滤波代码

用VC实现的图像中值滤波代码的例子,需要的可以参考。其中pImg为灰度图像指针,输出中值滤波的图像将覆盖原图像,iWidth为图像的宽度,iHeight为图像的高度,size为中值滤波的模板大小。

中值滤波是一种非常有用的非线性图像处理方法,该算法是1971年首次提出并应用于信号处理中,后来逐渐应用到图像处理中。它克服了线性滤波如最小均方滤波、均值滤波在对图像进行消噪处理后使图像的边缘变得模糊的负面影响,即中值滤波既可以去除图像中的噪声又能保护图像的边缘和轮廓。

具体代码如下:


void MedianFilter(IMG_DATATYPE *pImg,int iWidth,int iHeight,int size)
{
    IMG_DATATYPE *pSrc = NULL;
    IMG_DATATYPE *pBuff = NULL;
    int i,j,x,y,iRealSize;
    IMG_DATATYPE temp;

    pSrc = new IMG_DATATYPE[iWidth * iHeight];
    pBuff = new IMG_DATATYPE[size * size];
    if(pImg == NULL || pSrc == NULL || pBuff == NULL || iWidth <= 0 || iHeight <= 0)
        return;

    for(i=0;i<iHeight;i++)
    {
        for(j=0;j<iWidth;j++)
        {
            iRealSize = 0;
            for(x = -size/2;x <= size/2;x++)
                for(y = -size/2;y <= size/2;y++)
                {
                    if(i + x >= 0 && i + x < iHeight && j + y >= 0 && j + y < iWidth)
                    {
                        pBuff[iRealSize++] = pImg[(i + x) * iWidth + (j + y)];
                    }
                }
            
            for(x = 0;x < iRealSize - 1;x++)
                for(y = 0;y < iRealSize - 1 - x;y++)
                {
                    if(pBuff[y] > pBuff[y+1])
                    {
                        temp = pBuff[y];
                        pBuff[y] = pBuff[y+1];
                        pBuff[y+1] = temp;
                    }
                }

            pSrc[i * iWidth + j] = pBuff[iRealSize/2];
        }
    }

    memcpy(pImg, pSrc, iWidth * iHeight);

    delete pSrc;
    delete pBuff;
}



文章来自: 本站原创
引用通告: 查看所有引用 | 我要引用此文章
Tags: vc 图像 中值滤波 代码
相关日志:
评论: 2 | 引用: 0 | 查看次数: -
回复回复宝宝[2010-04-22 10:05 AM | del]
你会彩色图像的中值滤波吗
回复来自 admin 的评论 admin 于 2010-04-27 01:19 PM 回复
把彩色图像的R,G,B分别当成灰度图,进行中值滤波,然后合成彩色图像就可以了吧。
回复回复11[2009-11-24 11:58 AM | del]
看不懂呀!
发表评论
昵 称:
密 码: 游客发言不需要密码.
内 容:
验证码: 验证码
选 项:
虽然发表评论不用注册,但是为了保护您的发言权,建议您注册帐号.