- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我对图像缩放算法很感兴趣,并实现了双线性和双三次方法。但是,我听说过 Lanczos 和其他更复杂的方法可以实现更高质量的图像缩放,我很好奇它们是如何工作的。
这里有人可以解释一下使用 Lanczos 缩放图像(放大和缩小)背后的基本思想以及为什么它会产生更高的质量吗?
我确实有傅里叶分析的背景,过去做过一些信号处理的工作,但与图像处理无关,所以不要害怕在你的回答中使用诸如“频率响应”之类的术语: )
编辑:我想我真正想知道的是使用卷积滤波器进行插值背后的概念和理论。
(注意:我已经阅读了关于 Lanczos 重采样的维基百科文章,但它对我来说还不够详细)
最佳答案
为图像处理选择特定的过滤器是一种魔法,因为判断结果的主要标准是主观的:在计算机图形学中,最终的问题几乎总是:“它看起来好吗?”。那里有很多好的过滤器,最好的过滤器之间的选择通常归结为判断力。
也就是说,我将继续进行一些理论......
由于您熟悉用于信号处理的傅立叶分析,因此您实际上不需要了解更多就可以将其应用于图像处理——所有直接感兴趣的滤波器都是“可分离的”,这基本上意味着您可以应用它们在 x 和 y 方向上独立。这将重采样 (2-D) 图像的问题简化为重采样 (1-D) 信号的问题。您的信号不是时间 (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...]
请注意,这并没有什么神奇之处。有多种可用的窗口,它们的工作原理也差不多。此外,对于 a=1 和 2,频率响应看起来不太像阶跃函数。不过,我希望这能回答您“为什么要 sinc”的问题,并让您对频率响应等有所了解。
关于algorithm - 使用 Lanczos 缩放图像背后的想法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1854146/
我可以轻松计算 Lanczos 中使用的 sinc(x) 曲线的值,并且我已经阅读了之前有关 Lanczos 调整大小的解释,但作为这个领域的新手,我不明白如何实际应用它们。 To resample
我想用 C++ 实现上述两种图像重采样算法(双三次和 Lanczos)。我知道那里有许多现有的实现,但我仍然想制作自己的。我想实现它,部分原因是我想了解它们的工作原理,部分原因是我想为它们提供一些主流
我对图像缩放算法很感兴趣,并实现了双线性和双三次方法。但是,我听说过 Lanczos 和其他更复杂的方法可以实现更高质量的图像缩放,我很好奇它们是如何工作的。 这里有人可以解释一下使用 Lanczos
这个问题不太可能对任何 future 的访客有帮助;它只与一个较小的地理区域、一个特定的时间点或一个非常狭窄的情况相关,通常不适用于全世界的互联网受众。如需帮助使此问题更广泛适用,visit the
我需要在c代码中实现以下公式: https://en.wikipedia.org/wiki/Lanczos_resampling因此我使用多维插值方法: 其中 L(x-i) 或 L(y-i) 是: 我
我想知道是否有任何包允许我们使用 Lanczos 过滤器。我找到了其他滤波器,例如 butterworth,但我正在寻找 Lanczos 低通滤波器。 Lanczos 过滤器与巴特沃斯过滤器有何不同?
我已经在使用 Lanczos 函数的 OpenCL 中实现了一个简单的图像重采样器。 Lanczos 的定义是: 用 C 编写: inline float lanczos(float x, float
我想知道是否有任何包允许我们使用 Lanczos 过滤器。我找到了其他滤波器,例如 butterworth,但我正在寻找 Lanczos 低通滤波器。 Lanczos 过滤器与巴特沃斯过滤器有何不同?
所以我正在研究 Lanczos 算法的收敛。我用 C 语言实现它,首先计算与 Krylov 子空间相关的正交矩阵 V 和三对角对称矩阵 T,然后计算 T 的特征值和特征向量以及 Ritz vector
我有这个代码 CIImage * input_ciimage = [CIImage imageWithCGImage:self.CGImage]; CIImage * output_ciimage =
我正在尝试使用 Lanczos2 实现图像下采样。 但是,内核似乎到处都是零(因为如果 x 是整数,则 sin(pi*x)=0)except at the center pixel . 因此,如果下采
更新:一旦我让这个演示开始工作...老天,它很慢,只有 2 级渲染(当图像大约为 1000x2000 像素时)大约需要 12-16 秒。这甚至不值得为此烦恼。 我在此处的最佳答案中发现了这段非常棒且充
我需要制作一个使用 Lanczo 算法的在线图像大小调整程序,我听说这是缩小图像大小的最佳算法。我该怎么做呢?我了解 PHP,但如果需要,我愿意学习其他语言。 我知道 PHP 确实有它自己的图像调整大
我一直在编写一些在 Golang 中调整图像大小的基本方法。我看过几篇关于调整图像大小的帖子,但对于我的生活,我无法弄清楚我错过了什么...... 基本上,我的问题是在 Golang 中调整图像大小时
我尝试重新缩放 2D 图像(灰度)。图像大小为 256x256,所需输出为 224x224。像素值范围从 0 到 1300。 我尝试了 2 种方法来使用 Lanczos 插值重新缩放它们: 首先使用P
仅当我在使用调试标志编译的代码上使用 gdb 进行调试时,才会出现以下错误 Program received signal SIGSEGV, Segmentation fault. 0x00007ff
(这个问题可能与“无软件推荐”规则有关;我理解为什么它可能会被关闭)。 在他们的论文中 F_2 Lanczos revisited 、Peterson 和 Monico 给出了 Lanczos 算法的
我是一名优秀的程序员,十分优秀!