11

这个算法在我脑海中已经存在很长时间了,但我在任何地方都找不到它的描述。虽然它是如此简单,但我不能成为唯一一个想到它的人。以下是它的工作原理:

你从一个图像开始。比如说,7x7px:

算法 1

您需要将其重新采样为 5x5px:

算法 2

所以你所做的就是取每个新方块的平均颜色:

算法 3

这不是最近邻,因为它只采用一个像素的颜色,而不是恰好覆盖源像素的小数像素。它也不是双线性、双三次、lanczos 或任何其他插值。

那么 - 它是什么?在我看来,直觉上这应该是“数学上完美”的重采样算法,尽管由于我没有“数学上完美”的定义,我无法证明或反驳这一点。

最后但同样重要的是,“数学上完美”并不总是“最好看”,所以我想知道它在“质量”方面与其他主流图像重采样算法(双三次、lanczos)相比如何?当然,这是一个主观术语,所以我真的很感兴趣这个算法和其他算法之间是否存在显着差异,大多数人都会同意这一点。

PS 我已经可以讲述一些事情了——它不会是像素艺术的“最佳外观”,如此处所示;有专门的算法(2xSAI 等);而且它也不是放大图片的最佳选择 - 插值会在那里获胜。但是对于缩小图片...?

更新 1:嗯,刚刚发现了supersampling。这似乎是它的一个变体,具有网格类型的样本排列,其中样本的数量针对源图像和目标图像的分辨率进行了优化。

4

5 回答 5

3

您所说的算法称为区域平均算法,它是一种很少用于缩小图像的算法。

它的一个更简单的变体被用作一种抗锯齿技术,用于平滑计算机游戏中的渲染图像。

这种技术的算法称为超级采样

在此处输入图像描述

感谢@Guffa 指出,这是对上述算法的简化,因为它需要采样点并且可能会错过某些颜色,或者选择一种颜色的次数比另一种颜色多,即使它不是最主要的。
上述算法相当于超采样算法的无限点采样。

更新: 刚刚注意到,即使是 Java 也很欣赏你的算法 :)
AreaAveragingScaleFilter

于 2012-09-21T08:32:52.473 回答
3

我将首先说我不知道​​您的算法的正式名称。我知道 Paint Shop Pro 早期将其称为“双线性”,但在第 8 版中被指出该算法与双线性的经典定义不匹配时,被迫将其重命名为“加权平均”。

大多数调整大小算法可以在两个独立的通道中应用,一个在 X 方向,一个在 Y 方向。这不仅更有效,而且更容易描述和推理不同的算法。从现在开始,我将在一个维度上工作,并假设您可以推断为 2D。

您的输入由 7 个像素组成,我们将给出 0、1、2、3、4、5、6 的坐标。认识到在这种情况下像素不是一个小正方形 ,而只是一个点,这很有用。要创建输出,您将需要点 0.2、1.6、3.0、4.4、5.8 的插值。为什么不是 0.0、1.5、3.0、4.5、6.0?假设您将输入和输出的大小加倍为 14x14 和 10x10:坐标现在为 0.0、1.44、2.89、4.33、5.78、7.22、8.67、10.11、11.56、13.0。从第二个像素开始,结果会有所不同,这是不可接受的。所有点应相距 7/5,坐标为 0.2、1.6、3.0、4.4、5.8、7.2、8.6、10.0、11.4、12.8。

让我们比较以过滤器表示的常见调整大小算法,看看它们与您的比较。

最近邻过滤器

通用形式的第一个示例称为 Box 或 Averaging 过滤器。但是当盒子过滤器的宽度正好是 1.0 时会发生一件神奇的事情:输入中的一个像素将落在盒子内并被赋予 1.0 的权重,而输入中的所有其他像素将被赋予 0.0 的权重. 这使得它相当于最近邻算法。

双线性滤波器

我们的第二个示例通常称为 Tent 过滤器。当宽度恰好为 2.0 时,它再次变得特别,它变成了线性插值;应用于 2D 它称为双线性。

双三次过滤器

第三个例子是立方过滤器,当应用于 2D 时,它被称为 Bicubic。这个公式有不同的变体,这个例子使用了 Mitchell 和 Netravali 建议的那个。

高斯滤波器

虽然高斯滤波器不常用于调整大小的应用程序,但我在此处添加了它以进行比较。

加权平均过滤器

最后我们达到了你的算法。它是平均和双线性的组合,是一个平顶帐篷。

于 2012-09-27T02:54:55.560 回答
1

与我在其他答案中读到的相反,该算法实际上对于超级采样非常流行,至少在图像处理社区中是这样。

它在 Intel 的 Performance Primitives 库中以Super Sampling的名称实现;(相当不具信息性的)名称是一种说明库中没有用于超级采样的替代算法的方式。在 OpenCV 中,它的名称为INTER_AREA; 它被列在其他插值类型中,这可能表明它们是可以互换的,但提到“它可能是图像抽取的首选方法”——对我来说这是一个相当保守的说法。

当您通过整数因子对图像进行超采样时,例如通过因子 2,获取结果图像的基础像素的平均值(例如通过scikit-image's所做的downscale_local_mean)在特定意义上确实是最佳的。

假设您的图像是通过受体网格对信号进行一些定量测量而获得的。例如,照片或 X 射线,计算光子的数量。像素值与给定受体接收到的信号量成正比。

如果您假设您的相机是完美的——没有信号扩散,接收区域 100% 覆盖——那么意味着超级采样是最佳的,因为它可以提供完美相机接收到的精确图像,分辨率只有一半。

面积平均是这种最优平均超级采样到非整数比率的直接推广,这解释了它的流行,尽管它不能对除整数以外的任何超级采样比率拥有相同的属性。

于 2017-07-21T17:04:46.440 回答
0

您的描述并没有让我想起最有可能是数据结构和数据类型的算法。它让我想起了 kd-tree 或四叉树。kd-tree 或四叉树可以帮助您解决最近邻的问题。但是,如果想要网格的数学函数,您还可以查看空间填充曲线,尤其是 z 阶莫顿曲线。这适用于 2 的幂并降低 2d 复杂性。函数是 f(x,y) = (f(x), f(y))。

于 2012-09-21T09:05:13.420 回答
-2

它也不是双线性的

是的,实际上是这样。双线性重采样只是二维的线性插值。

您将其描述为获取像素表面的平均颜色,但从周围像素进行插值只是计算相同值的一种更简单的方法。

插值一次完成一维,因此您只需计算重叠边而不是重叠区域,这要简单得多。

于 2012-09-21T08:29:25.667 回答