1

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

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

4

3 回答 3

2

简单回答是不。使用高斯进行数学滤波意味着您正在使用高斯对数据进行卷积。但是卷积与傅里叶域中的乘法相同,因此重复应用滤波器就像傅里叶域中的重复乘法一样,在这里您可以看到事情要么爆炸,要么归零。可能还有其他一些也有效地称为过滤的东西不会这样做,并且您可能可以制作或挖掘一些可以满足您需求的东西,但是使用相同内核(高斯或其他方式)的重复卷积不会收敛。

于 2009-07-06T03:28:06.140 回答
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。当图形值不再变化时,可以通过在最终产品中删除前两个数组来优化这一点。

于 2009-07-10T10:25:07.213 回答
0

您可能想尝试中值过滤器

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

于 2009-07-11T08:33:14.073 回答