我在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代码正在采取一些额外步骤,请告诉我。
答案 0 :(得分:0)
我认为从邻居缓冲区计算的中值是错误的。 应该是邻居[(kernelSize * kernelSize)/ 2]。 你能尝试这种修正吗?