中值滤波器实现测试

Median filter implementation testing

我在 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,噪声确实会被完全过滤掉。但令我担忧的是,MATLAB 中值滤波器代码能够完全去除噪声,即使内核大小为 3X3。这让我怀疑。请查看代码,让我知道过滤器实现中是否存在错误或 MATLAB 代码是否采取了一些额外的步骤。

我认为从邻域缓冲区计算的中值是错误的。 它应该是 neighbourhood[(kernelSize*kernelSize)/2]。 你能试试这个更正吗?