频域中的高通滤波器

时间:2014-02-19 18:14:48

标签: image-processing filtering signal-processing fft

我的HPF有问题。在dft上实施H​​PF后,生成的图像非常奇怪。

这里有一个例子(我是新的,所以我不能发布图片,但如果没有它我就无法表达这个问题):

http://imageshack.com/a/img69/5911/tnj6.png

http://imageshack.com/a/img132/6931/fc8k.png应用半径为50的HPF

我不明白为什么会出现这种情况。当我在HPF掩模的中心添加白点时,结果是好的。低通滤波器也能很好地工作。

我想我可以消除我的FFT实现错误的可能性,因为我自己编写了一个并且我也使用了这个实现:librow.com/articles/article-10并且结果几乎相同。

这是我的HPF代码:

void Picture::HighPass(int radius){
    const complex<double> oblivion=(0,0);
    const int middlex = w/2;
    const int middley=h/2;
    double distance=0;

    int * T = new int[w*h];

    //draw circle in the center
    for(int y=0; y<h; y++){
        for(int x=0; x<w; x++){
            distance = sqrt(pow((middlex-x),2) + pow((middley-y),2));
            if(distance<radius){ 
                T[x+y*w]=0;
            } else T[x+y*w]=1;
        }
    }
    //T[middlex+middley*w]=1;
    int *temp = new int[w*h];
    for(int i=0;i<w*h;i++)temp[i]=T[i];

        //swap quadrants 
    for(int x=0;x<middlex;x++){
        for(int y=0;y<middley;y++){
            T[x+y*w] = temp[(middlex+x)+(middley+y)*w];
            T[(middlex+x)+(middley+y)*w] = temp[x+y*w];
            T[(middlex+x)+y*w] = temp[x+((middley+y)*w)];
            T[x+((middley+y)*w)] = temp[(middlex+x)+y*w];
        }
    }

    for(int i=0;i<w*h;i++)
        if(T[i]==0) dft[i]=oblivion;

    delete [] T;
    delete[] temp;
}

如果你能给我一些建议或解决方案,我将非常感激。

1 个答案:

答案 0 :(得分:0)

首先,滤镜内核中心的点有效地代表了图像的平均亮度/强度/偏移/偏差。这是过滤器的关键部分。如果将图像从空间域转换为频域,并且混乱使用中心像素,则会更改图像的平均亮度。

其次,看起来你正在实现一个砖墙式过滤器,只需在你的内核中生成一个黑色圆形。如果您将其视为3D图像,它看起来像一个实心圆柱体。要修复振铃伪像(即:任何时候使用砖墙滤波器,您将遇到振铃/混叠伪像),使用高斯类型的滤波器。如果将其可视化为3D图像,它看起来像是高斯分布的山型形状。请参阅参考资料。

因此,简而言之,不是生成砖墙滤波器,而是使用高斯滤波器。有关完整描述的图形示例,请参阅参考文献[3]中的“低通滤波:模糊”一节。

<强>参考

  1. 高斯平滑,已访问2014-02-19,<http://homepages.inf.ed.ac.uk/rbf/HIPR2/gsmooth.htm>
  2. 高斯过滤,已访问2014-02-19,<https://www.cs.auckland.ac.nz/courses/compsci373s1c/PatricesLectures/Gaussian%20Filtering_1up.pdf>
  3. 测试FFT处理,已访问2014-02-19,<http://www.fmwconcepts.com/misc_tests/FFT_tests/>