这个算法已经在我脑海中存在了很长时间,但我无法在任何地方找到它。虽然我不能成为唯一一个想到它的人,但这很简单。以下是它的工作原理:
您从图像开始。比方说,7x7px:
你需要重新取样,比如5x5px:
所以你要做的就是采用每个新方块的平均颜色:
这不是最近邻居,因为它只采用一个像素的颜色,而不是恰好覆盖源像素的分数像素。它也不是双线性,双三次,lanczos或任何其他插值。
那么 - 它是什么?在我看来,这应该是“数学上完美的”重采样算法,虽然因为我没有“数学上完美”的定义,所以我无法证明或证明这一点。
最后但并非最不重要的是,“数学上完美”并不总是“最好看”,所以我想知道它在“质量”方面与其他主流图像重采样算法(bicubic,lanczos)相比如何?当然,这是一个主观的术语,所以如果这个算法和其他算法之间存在显着差异,我很感兴趣,这是大多数人都会同意的。
P.S。我已经可以告诉它的一些事情 - 它不会像素艺术那样“最好看”,如此处所示;有特殊的算法(2xSAI等);并且它也不是最好的放大图片 - 插值会赢得那里。但是为了缩小图片......?
更新1:嗯,刚刚发现了supersampling。这似乎是它的变体,具有网格类型的样本排列,其中样本的数量针对源和分辨率进行了优化。目标图像。
答案 0 :(得分:3)
您所说的算法称为区域平均算法,它是一种很少应用于缩小图像的算法。
它的一个更简单的变体被用作抗锯齿技术,用于平滑计算机游戏中的渲染图像。
此技术的算法称为Supersampling
感谢@Guffa指出它,它是上述算法的简化,因为它需要采样点并且可能错过某些颜色,或者选择一种颜色比另一种颜色更多,即使它不是最主要的。
上述算法等于超级采样算法的无限点采样。
<强>更新强> 刚刚注意到即便是Java也会欣赏你的算法:) AreaAveragingScaleFilter
答案 1 :(得分:3)
我首先要说的是我不知道你算法的正式名称。我知道Paint Shop Pro早期称它为“Bilinear”,但是当它被指出该算法与Bilinear的经典定义不匹配时,被迫将其重命名为版本8中的“加权平均值”。
大多数调整大小的算法可以应用于两个独立的通道,一个在X方向,一个在Y.这不仅更有效,而且使得更容易描述和推理不同的算法。从这一点开始,我将在一个维度上工作并假设您可以推断为2D。
您的输入由7个像素组成,我们将给出坐标0,1,2,3,4,5,6。在此上下文中实现a pixel is not a little square非常有用,但只是一个点。要创建输出,您需要来自点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中应用它称为双线性。
第三个例子是Cubic滤镜,当在2D中应用时称为Bicubic。这个公式有不同的变体,这个例子使用了Mitchell和Netravali建议的那个。
虽然高斯滤波器通常不用于调整应用程序的大小,但我在此处添加了它以进行比较。
最后,我们达到了您的算法。它是平均和双线性的结合,一个平顶的帐篷。
答案 2 :(得分:1)
与我在其他答案中读到的相反,这种算法实际上非常适用于超级采样,至少在图像处理领域是这样。
它在名为Super Sampling的英特尔Performance Primitives库中实现; (相当无信息的)名称是一种表明在库中没有替代算法的替代算法的方法。在OpenCV中,它名为INTER_AREA
;它列在其他插值类型中,这可能表明它们是可以互换的,但是提到“它可能是图像抽取的首选方法” - 这是一个相当保守的陈述。
当您使用整数因子对图像进行超采样时,比如两倍,在特定意义上,获取结果图像的基础像素的平均值确实是最佳的。
假设您的图像是通过受体网格对信号进行定量测量而获得的。例如,照片或X射线,计算光子数量。像素值与给定受体接收的信号量成比例。
如果您认为您的相机是完美的 - 没有信号的扩散,接收区域的100%覆盖 - 则意味着超级采样是最佳的,因为它提供了具有一半分辨率的完美相机将接收的精确图像。
区域平均是这种最优均值超级采样与非整数比率的简单推广,这解释了它的受欢迎程度,尽管它不能为除整数之外的任何超采样率提供相同的属性。
答案 3 :(得分:0)
您的描述并没有让我想起一个最有可能是数据结构和数据类型的算法。它让我想起了一棵kd树或四叉树。 kd-tree或quadtree可以帮助您解决最近邻居的问题。但是,如果想要网格的数学函数,您还可以查看空间填充曲线,尤其是z阶Morton曲线。这对于2的幂而言非常有效并且降低了2d的复杂度。函数是f(x,y)=(f(x),f(y))。
答案 4 :(得分:-1)
它也不是双线性的
是的,实际上是。双线性重采样只是二维线性插值。
您将其描述为获取像素表面的平均颜色,但是从周围像素进行插值只是计算相同值的一种更简单的方法。
插值一次一维地完成,因此您只需计算重叠边而不是重叠区域,这样会更简单。