原创 图像中值滤波

2009-2-23 22:08 3134 9 9 分类: 软件与OS

    中值滤波是一种非线性型号处理方法,将每个像素的灰度值用其领域的中值代替。中值是指领域内奇数个数据按大小排序后处于中心位置的那个数。中值滤波能够在去除椒盐噪声的同时保持边缘清晰。
    中值滤波是一个比较耗时的算法,为了提高速度,在程序设计时,并不需要对领域内所有点排序,只需要找到中值即可,因此这里只对前5个点进行了排序。


// 中值滤波
// 1. pImageData   图像数据
// 2. nWidth       图像宽度
// 3. nHeight      图像高度
// 4. nWidthStep   图像行大小
BOOL SmoothMedian(unsigned char *pImageData, int nWidth, int nHeight, int nWidthStep)
{
    int            i            = 0;
    int            j            = 0;
    int            m            = 0;
    int            n            = 0;
    int            nValue       = 0;
    unsigned char *pLine[3]     = { NULL, NULL, NULL };
    unsigned char  chTempValue  = 0;
    unsigned char  chTempArray[9];
    for (j = 1; j < nHeight - 1; j++)
    {
        pLine[0]  = pImageData + nWidthStep * (j - 1);
        pLine[1]  = pImageData + nWidthStep * j;
        pLine[2]  = pImageData + nWidthStep * (j + 1);
        for (i = 1; i < nWidth - 1; i++)
        {
            chTempArray[0] = pLine[0][i-1];
            chTempArray[1] = pLine[0];
            chTempArray[2] = pLine[0][i+1];
            chTempArray[3] = pLine[1][i-1];
            chTempArray[4] = pLine[1];
            chTempArray[5] = pLine[1][i+1];
            chTempArray[6] = pLine[2][i-1];
            chTempArray[7] = pLine[2];
            chTempArray[8] = pLine[2][i+1];
            // 取中值
            for (m = 0; m < 5; m++)
            {
                for (n = m + 1; n < 9; n++)
                {
                    if (chTempArray[m] > chTempArray[n])
                    {
                        chTempValue    = chTempArray[m];
                        chTempArray[m] = chTempArray[n];
                        chTempArray[n] = chTempValue;
                    }
                }
            }
            pLine[0][i-1] = chTempArray[4];
        }
    }
    return TRUE;
}


中值滤波效果:

0cdde67f-67e5-4f8c-9d7c-039de8b2ec3a.jpgf28cdfb2-aa9a-4911-b782-8fb95b86e584.jpg

文章评论0条评论)

登录后参与讨论
我要评论
0
9
关闭 站长推荐上一条 /2 下一条