如何在不丢失形状的情况下过滤数据?

时间:2009-07-05 20:17:28

标签: math graph filtering

是否存在会聚在某种形状的过滤算法?我的问题是我正在过滤二维图,并重复应用过滤。我正在对数据进行下采样并使用高斯滤波器(足迹)对其进行重新采样,但是图形会随着每次后续滤波而改变其形状。我需要的是获得一些最终形状,以便在经过充分过滤后,图形将不再改变形状。

编辑:通过过滤我的意思是平滑,而不是删除一些信息。

3 个答案:

答案 0 :(得分:2)

简单的答案是否定的。使用高斯进行数学滤波意味着您使用高斯卷积数据。但是convolving is the same as multiplying in the Fourier domain,所以重复应用滤波器就像傅里叶域中的重复乘法一样,在这里你可以看到事情会爆炸或者变为零。可能还有一些其他的东西也被称为过滤而不能做到这一点,并且你可能能够制造或挖掘一些可以做你想要的东西,但是使用相同内核(高斯或其他)的重复卷积将不会收敛。

答案 1 :(得分:0)

找到了一个非常好的黑客来解决这个问题。我没有重复过滤数据,而是将权重值重新分配给2d图的各个值。这个权重值告诉我应该对相应的图形位置应用多少过滤。该权重值还告诉我们高斯滤波器的宽度(值影响的范围)。这是每次图值更改时需要执行的代码。

vector<float> graph_values(100);
vector<float> graph_weights(100);
vector<float> graph_filtered_values(100);

// temp
vector<float> accumulated_weights(graph_values.size());


for(int x1=0;x1<graph_values.size();x1++)
{
    graph_filtered_values[x1] = 0;

    for(int x2=x1-30;x2<=x1+30;x2++)
    {
       float w = expf(-.5*(float)(x2-x1)*(x2-x1)/(graph_weights[x2]*graph_weights[x2]));

       if( x2==x1&&!_finite(w) )
           w = 1;
       if( w<0.0001 ) 
           w = 0;

       graph_filtered_values[x1] += graph_values[x2] * w;

       accumulated_weights[x1] += w;
    }
}

for(int x1=0;x1<graph_values.size();x1++)
{
    graph_filtered_values[x1] /= accumulated_weights[x1];
}

此算法使用三倍的内存:对于graph_values,graph_weights和graph_filtered_values。当图表值不再变化时,可以通过在最终产品中删除前两个数组来优化这一点。

答案 2 :(得分:0)

您可能想尝试median filter

  

中值滤波器是用于平滑信号的非线性滤波器的特例。由于中值滤波器的输出始终是输入样本之一,因此可以想象某些信号可以不改变地通过中值滤波器。这些信号定义了滤波器的特征,并称为根信号。已知中值滤波器具有收敛特性,这意味着通过重复中值滤波,将从任何输入信号开始找到根信号。
Burian Adrian, Kuosmanen Pauli: Tuning the smoothness of the recursive median filter, IEEE Transactions on Signal Processing 50(7), pp. 1631-1639, 2002

相关问题