中值滤波器实现测试
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]。
你能试试这个更正吗?
我在 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]。 你能试试这个更正吗?