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

Math 如何在不丢失形状的情况下过滤数据?,math,graph,filtering,Math,Graph,Filtering,是否有一种以某种形状收敛的过滤算法?我的问题是,我正在过滤一个二维图,并反复应用过滤。我正在对数据进行向下采样,并使用高斯滤波器(足迹)对其重新采样,但图形会随着后续每次滤波而改变其形状。我需要的是实现一些最终的形状,这样经过足够的过滤后,图形将不再改变形状 编辑:我所说的过滤是指平滑,而不是删除一些信息。简单的答案是否定的。用高斯函数进行数学过滤意味着用高斯函数对数据进行卷积。但是,滤波器的重复应用就像傅里叶域中的重复乘法,在这里你可以看到事情要么爆炸,要么变为零。也许还有一种被有效地称为过滤

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


编辑:我所说的过滤是指平滑,而不是删除一些信息。

简单的答案是否定的。用高斯函数进行数学过滤意味着用高斯函数对数据进行卷积。但是,滤波器的重复应用就像傅里叶域中的重复乘法,在这里你可以看到事情要么爆炸,要么变为零。也许还有一种被有效地称为过滤的东西不能做到这一点,你也许可以制作或挖掘出某种东西来做你想做的事情,但是用同一个内核重复的卷积,不管是高斯还是其他,都不会收敛。

找到了解决这个问题的很好的方法。我不是重复地重新过滤数据,而是将权重值重新分配给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];
}
矢量图_值(100);
向量图_权重(100);
向量图过滤值(100);
//临时工
向量累积的_权重(graph_values.size());
对于(int-x1=0;x1,您可能需要尝试一个

中值滤波器是用于平滑信号的非线性滤波器的一种特殊情况。由于中值滤波器的输出始终是输入样本之一,因此可以想象某些信号可以不经改变地通过中值滤波器。这些信号定义滤波器的特征,称为根信号。中值滤波器我们知道它具有收敛性,这意味着通过重复中值滤波,将从任何输入信号开始找到根信号。
()


虽然线性滤波器的答案是正确的,但肯定有“另一种也被有效地称为滤波的东西”,即非线性滤波器的类别。