中值过滤器实现测试

时间:2015-09-10 06:15:32

标签: c matlab median

我在C中实现了2D中值滤波器。对于大小为1440X1440的图像,浮点值。为了开始,我尝试使用简单的3X3内核大小。这是代码。

#define     kernelSize      3

void sort(float *array2sort, int n)
{
    float       temp;
    for(int i=0; i < n-1; i++)
        for(int j=0; j < n-1-i; j++)
            if(array2sort[j] > array2sort[j+1])
            {
                temp = array2sort[j];
                array2sort[j] = array2sort[j+1];
                array2sort[j+1] = temp;
            }
}


void medianFilter(float *input, float *output)
{
    int     halfKernelSize = kernelSize/2;

    float   neighbourhood[kernelSize*kernelSize];

    for(int i=0+halfKernelSize; i<(1440-halfKernelSize); i++)
        for(int j=0+halfKernelSize; j<(1440-halfKernelSize); j++)
        {
            for(int ii=-halfKernelSize; ii<halfKernelSize+1; ii++)
                for(int jj=-halfKernelSize; jj<halfKernelSize+1; jj++)
                    neighbourhood[(ii+halfKernelSize)*kernelSize+(jj+halfKernelSize)] = input[(i+ii)*1440+(j+jj)];
            sort(neighbourhood, kernelSize*kernelSize);
            output[(i)*1440+(j)] = neighbourhood[(kernelSize*kernelSize)/2+1];
        }

}

现在,为了验证代码是否正常,我拍了一张图片,添加了盐和水。使用MATLAB胡椒噪音。然后尝试了上面的代码。我可以看到噪音几乎完全减少,剩下几个点。如果我将内核大小增加到5X5,噪声会被完全过滤掉。但对我来说令人担忧的事实是,即使使用大小为3X3的内核,MATLAB中值滤波器代码也能够完全消除噪声。这让我有疑问。请查看代码,如果过滤器实现中存在某些错误或者MATLAB代码正在采取一些额外步骤,请告诉我。

1 个答案:

答案 0 :(得分:0)

我认为从邻居缓冲区计算的中值是错误的。 应该是邻居[(kernelSize * kernelSize)/ 2]。 你能尝试这种修正吗?