使用Lanczos算法缩放图像的原理是什么?

36

我对图像缩放算法很感兴趣,已经实现了双线性和双三次方法。但是我听说过Lanczos和其他更复杂的方法可以实现更高质量的图像缩放,我很想知道它们是如何工作的。

这里是否有人能够解释一下使用Lanczos对图像进行缩放(包括上采样和下采样)的基本思路,并且为什么它会产生更高的质量?

我具备傅里叶分析的背景,过去也做过一些信号处理方面的工作,但与图像处理无关,所以不要害怕在回答中使用“频率响应”之类的术语 :)

编辑:我想知道的真正问题是使用卷积滤波器进行插值的概念和理论。

(注意:我已经阅读了维基百科关于Lanczos重采样的文章,但是对我来说没有足够的详细信息)


你看过任何示例代码吗?我不知道例如mplayer的swscale实现有多可读。但你可能正在寻找其背后的理论,而我也不知道。 - Peter Cordes
5
有兴趣的读者可以在我们的姊妹网站上找到一份插图详细解释此问题的文章,链接为http://gis.stackexchange.com/a/14361。 - whuber
有一篇优秀的文章比较重采样算法,尽管它的测试是旋转而不是缩放。 - Roman Starkov
Catmull-Rom三次样条公式产生的结果非常接近于Lanczos-2,但数学计算要简单得多。 - Mark Ransom
https://icess.eri.ucsb.edu/gem/Duchon_1979_JAM_Lanczos.pdf - swiss_knight
我已经写了一篇博客文章,目的就是为了解释Lanczos窗口函数的来源,而不仅仅是简单地陈述它。https://mazzo.li/posts/lanczos.html - bitonic
1个回答

49
选择特定的图像处理滤镜有些黑科技,因为判断结果的主要标准是主观的:在计算机图形学中,最终问题几乎总是:“看起来好吗?” 有很多好的滤镜可供选择,最佳滤镜之间的选择通常取决于判断。
话虽如此,我还是会提一些理论...
自从您熟悉用于信号处理的傅里叶分析以来,您不需要了解更多内容即可将其应用于图像处理 - 所有立即感兴趣的滤波器都是“可分离的”,这基本上意味着您可以在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”的问题,并让你对频率响应等有了一些想法。


1
我知道这个答案现在已经很老了,但我想知道:是否真的希望使用频率框滤波器来缩小图像?那不会本质上意味着像一个像素的轮廓线被消除了吗(通过理想滤波器)?这是需要的吗,还是基于sinc的滤波器只对可以被视为“连续”的性质(例如光栅采样的照片)的图像真正有效,而对于更具像素艺术性质的图像永远不适用? - Dolda2000
4
一像素轮廓不会消失,但是当通过纯正的sinc滤波器处理时,它们会呈现出一种特别清晰的视觉上令人不快的“环绕”效果。在这方面,Lanczos风格的滤波器更好,但您正确地指出,基于sinc的滤波器最适合“连续”的图像 - 像素艺术风格的图像无论使用任何线性调整大小的滤波器都表现不佳,因为它们依赖于锐利的水平和垂直边缘。 - comingstorm

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接