使用lanczos缩放图像背后的想法是什么?

hor*_*guy 25 algorithm graphics image image-processing image-scaling

我对图像缩放算法感兴趣,并实现了双线性和双三次方法.但是,我听说过lanczos和其他更复杂的方法可以实现更高质量的图像缩放,我很好奇它们是如何工作的.

有人可以在这里解释使用lanczos(放大和缩小)缩放图像背后的基本思想以及为什么它会带来更高的质量?

我确实有傅里叶分析的背景,过去曾做过一些信号处理工作,但与图像处理无关,所以不要害怕使用像"频率响应"这样的术语,如你的答案:)

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

(注意:我已经阅读了有关lanczos重采样的维基百科文章,但它没有足够的细节供我使用)

非常感谢!

com*_*orm 35

选择用于图像处理的特定滤镜是一种黑色艺术,因为判断结果的主要标准是主观的:在计算机图形学中,最终的问题几乎总是:"它看起来好吗?".那里有很多好的过滤器,最好的选择往往归结为判断.

那就是说,我会继续讨论一些理论......


由于您熟悉信号处理的傅里叶分析,因此您不需要了解更多将其应用于图像处理 - 所有直接感兴趣的过滤器都是"可分离的",这基本上意味着您可以在x和y方向.这减少了重新采样(2-D)图像以重新采样(1-D)信号的问题.你的信号不是时间(t)的函数,而是一个坐标轴(比如x)的函数; 其他一切都完全一样.

最终,您需要使用滤波器的原因是为了避免混叠:如果要降低分辨率,则需要滤除新的,较低分辨率不支持的高频原始数据,或者将其添加改为不相关的频率.

所以.当您从原件中滤除不需要的频率时,您希望保留尽可能多的原始信号.此外,您不希望扭曲您保留的信号.最后,您希望尽可能完全消除不需要的频率.这意味着 - 理论上 - 良好的滤波器应该是频率空间中的"盒子"函数:对于截止频率以上的频率具有零响应,对于截止频率以下的频率具有单位响应,并且在它们之间具有阶跃函数.而且,从理论上讲,这种反应是可以实现的:正如您所知,直接正弦滤波器将为您提供准确的结果.


这有两个问题.首先,直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...]
Run Code Online (Sandbox Code Playgroud)
  • sinc(pi x)决定频率响应的整体形状(对于较大的a,频率响应看起来越来越像一个盒子函数)
  • 框(| x | <a)给它有限的支持,所以你可以使用直接卷积
  • sinc(pi x/a)使盒子边缘平滑(因此?等效?)极大地改善了对不需要的高频的抑制
  • 最后两个因素("窗口")也降低了铃声; 它们在感知伪像和"下冲"的实际发生率方面都有了很大的改进 - 尽管没有完全消除它们

请注意,这些都没有任何魔力.有各种各样的窗户可供使用,也可以使用.此外,对于a = 1和2,频率响应看起来不像阶跃函数.但是,我希望这能回答你的问题"为什么sinc",并让你对频率响应等有所了解.

  • 单像素轮廓不会消失,但是当通过纯sinc滤波器时,它们确实产生了上述视觉上令人讨厌的"振铃"效果的特别清晰的版本.Lanczos风格的滤镜在这方面更好,但你认为基于sinc的滤镜最适合"连续"的图像是正确的 - 像素艺术风格的图像不适合*任何*线性调整大小的滤镜,由于它们依赖于尖锐的水平和垂直边缘. (3认同)