选择特定的图像处理滤镜有些黑科技,因为判断结果的主要标准是主观的:在计算机图形学中,最终问题几乎总是:“看起来好吗?” 有很多好的滤镜可供选择,最佳滤镜之间的选择通常取决于判断。
话虽如此,我还是会提一些理论...
自从您熟悉用于信号处理的傅里叶分析以来,您不需要了解更多内容即可将其应用于图像处理 - 所有立即感兴趣的滤波器都是“可分离的”,这基本上意味着您可以在x和y方向上独立地应用它们。 这将2D图像重新采样的问题简化为1D信号重新采样的问题。 您的信号不是时间函数(t),而是一个坐标轴的函数(例如,x);其他所有内容完全相同。
最终,您需要使用滤镜的原因是避免混叠:如果您降低分辨率,则需要过滤掉新分辨率不支持的高频原始数据,否则它将被添加到不相关的频率中。
因此。 在过滤掉原始不想要的频率时,您希望尽可能保留原始信号。 此外,您不希望扭曲所保留的信号。 最后,您希望尽可能完全地消除不需要的频率。 这意味着 - 理论上 - 一个好的滤波器应该是在频率空间中的“盒形”函数:对于截止频率以上的频率具有零响应,在截止频率以下的频率具有单位响应,并且在两者之间具有阶跃函数。 理论上,这种响应是可实现的:正如您可能知道的那样,直接的sinc滤波器将为您提供完全相同的结果。
这里有两个问题。 首先,直接的sinc滤波器是无限制的,并且下降得不太快;这意味着进行直接卷积将非常慢。与其进行直接卷积,不如使用FFT并在频率空间中进行滤波...
但是,如果您实际上使用直接的sinc滤波器,则问题在于它实际上看起来不太好! 如相关问题所述,感知上存在振铃伪影,实际上没有完全令人满意的方法来处理“欠冲”的负值。
最后,解决问题的一种方法是从sinc滤波器开始(因为其良好的理论特性),并对其进行微调,直到您拥有解决其他问题的东西。 具体而言,这将使您获得类似于Lanczos滤波器的东西:
Lanczos filter: L(x) = sinc(pi x) sinc(pi x/a) box(|x|<a)
frequency response: F[L(x)](f) = box(|f|<1/2) * box(|f|<1/2a) * sinc(2 pi f a)
[note that "*" here is convolution, not multiplication]
[also, I am ignoring normalization completely...]
- sinc(pi x)决定了频率响应的整体形状(对于较大的a,频率响应看起来越来越像一个方波函数)
- box(|x|<a)使其具有有限支持,因此可以使用直接卷积
- sinc(pi x/a)平滑了盒子的边缘,并(相应地?等效地?)极大地提高了不良高频的抑制能力
- 最后两个因素(“窗口”)也减轻了震荡;它们在感知性效果和“欠冲”实际发生率方面都有巨大的改进——尽管没有完全消除它们
请注意,这些都没有什么神奇之处。有各种各样的窗口可用,它们的效果几乎一样好。此外,对于a=1和2,频率响应看起来并不像阶跃函数。但是,我希望这回答了你的“为什么要用sinc”的问题,并让你对频率响应等有了一些想法。