2009-07-05 97 views
1

是否有一种过滤算法会收敛在某种形状?我的问题是我正在过滤一个二维图,并重复应用过滤。我正在下采样数据并使用高斯滤波器(足迹)对其重新采样,但图形会随着每次后续滤波而改变其形状。我需要的是获得最终的形状,以便经过足够的过滤后,图形不再改变形状。如何在不丢失形状的情况下过滤数据?

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

回答

2

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

+0

很高兴知道!谢谢 – AareP 2009-07-07 05:55:35

0

发现这个问题很不错。我不会重复过滤数据,但会将权重值重新分配给二维图的各个值。这个权重值告诉我应该对相应的图表位置应用多少过滤。这个权重值也告诉我们高斯滤波器的宽度(值影响的范围)。这是每次图形值改变时需要执行的代码。

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。当图形值不再改变时,可以通过在最终产品中丢弃前两个数组来优化这一点。

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

相关问题