【问题标题】:Image resizing: what is a "filter"?图像大小调整:什么是“过滤器”?
【发布时间】:2026-01-11 08:15:01
【问题描述】:

我正在尝试了解图像大小调整的工作原理 - 请有人向我解释一下“过滤器”有什么用处?

  • 过滤器是否计算源像素对目标像素的贡献?

  • 有像“box”和“gaussian”这样的过滤器,但是有没有一个叫做“bicubic”的过滤器?我是否在这里混合了两个概念,一个是“卷积滤波器”和...?

  • 是否可以对放大和缩小使用相同的过滤器? (很高兴看到这样的示例代码)

  • 是否需要先在一个维度上拉伸图像,然后在另一个维度上拉伸?

【问题讨论】:

    标签: graphics 2d image-scaling cg


    【解决方案1】:

    在调整图像大小时,过滤器避免了一种称为aliasing 的现象。如果您尝试在不使用滤镜的情况下调整大小,则锯齿通常表现为令人讨厌的像素化效果,在动画时尤其明显......

    回答你的观点:

    • 过滤器会计算每个源像素对每个目标的贡献程度。为了调整大小,您需要一个线性过滤器,这非常简单:过滤器可以被视为小灰度图像;实际上,您将过滤器集中在与每个输出像素对应的位置上,将每个附近的像素乘以该位置的过滤器值,然后将它们相加得到输出像素值。

    • 所有此类过滤器都是“卷积过滤器”,因为卷积是上述操作的数学名称。 “盒子”过滤器实际上看起来像一个盒子 - 盒子内的每个像素的权重均等,而“高斯”过滤器是更圆的斑点,在边缘向零羽化。

    • 放大和缩小最重要的是为您的过滤器选择正确的尺寸。简而言之,您希望根据输入和输出中分辨率最低的任何一个来缩放过滤器。第二个最重要的事情是避免坏过滤器:“盒子”过滤器是您尝试调整大小而不过滤时通常得到的;计算机图形硬件提供的“双线性”过滤器产生平庸的放大,但提供的尺寸错误用于缩小。

    • 出于性能原因,希望先在一个维度上缩放图像,然后再在另一个维度上缩放图像。这意味着您的过滤器运行得更快:时间与过滤器宽度成正比,而不是与过滤器面积成正比。这里讨论的所有过滤器都是“可分离的”,这意味着您可以通过这种方式应用它们。

    如果您选择高质量的过滤器,确切的形式就没有您想象的那么重要。有两类好的滤波器:全正滤波器,如“gaussian”,倾向于模糊的一面;负波瓣滤波器,如“lanczos”,锐利,但可能会产生轻微的振铃效应。请注意,“双三次”过滤器是一个类别,其中包括全正的“B-spline”,以及具有负波瓣的“Mitchell”和“Catmull-Rom”。

    【讨论】:

    • 非常感谢!我想我终于明白当*说“可以通过应用卷积获得具有相似属性的[双三次]插值器”时。最后一件事,我仍然不明白用于放大和缩小的 size 是如何工作的。我多次看到过滤器对值进行了硬编码,说 Catmull-Rom 的大小为 2。尤其是缩小比例,如果我有一张 1000 像素大的图片,并且要将其调整为 10 像素,那么大小应该是 100 吗?为每个输出像素“平均”(?) 100 个像素不是很慢吗?
    • 你的猜测是正确的。对于放大,应根据输入像素间距调整滤波器的大小,但对于缩小,应根据输出像素间距调整滤波器的大小。这就是我在写“您想根据输入和输出中分辨率最低的那个来缩放过滤器”时的意思。
    • 而且,是的,每个输出像素的速度很慢,但是如果不处理所有 输入 像素,您就不能指望逃脱。
    最近更新 更多