下采样时的插值算法

21

我正在尝试理解降采样。我可以看出,插值算法(如双三次和最近邻)可以用于上采样,在旧有的已知点(在图像中为像素)之间“填充空白”。

但是降采样呢?我无法看出任何插值技术可以用于此。没有空白需要填充!

我一直被这个问题困扰得太久了,请给我指一个正确的方向。当你实际上删除已知数据时,你该如何进行插值?

编辑:让我们假设我们有一个一维图像,每个点有一个颜色通道。通过平均像素值将6个点缩放为3个点的降采样算法如下: 1,2,3,4,5,6 = (1+2)/2,(3+4)/2,(5+6)/2 我是否走在正确的轨道上?这是降采样中的插值,而不仅仅是丢弃数据吗?


1
你的编辑想法正确。1,2,3,4,5,6 -> 1.5, 3.5, 5.5。另一个例子是6,0,6,0,6,0 -> 3, 3, 3;这比0,0,0或6,6,6更好。 - tom10
6个回答

19
如果将原始像素的宽度定为n,则像素中心距离边缘各为n/2。
可以假设像素中心定义了颜色。
如果你要进行降采样,你可以这样概念化地考虑:即使你减小了物理尺寸,也可以认为你保持了相同的尺寸,但是减少了像素数量(在概念上增加了大小)。然后,可以进行数学计算...
例如:假设您的图像高度为1个像素,宽度为3个像素,并且您只会水平缩小。假设您将其更改为2个像素宽。现在,原始图像为3n,您正在将其转换为2个像素,因此每个新像素将占据原始图像像素的(3/2)。
现在再想想中心... 新像素的中心位于(3/4)n和(9/4)n处[即(3/4)+(3/2)]。原始像素中心位于(1/2)n、(3/2)n和(5/2)n处。因此,每个中心都在我们找到原始像素中心的位置之间 - 没有一个与原始像素中心完全匹配。让我们来看看位于(3/4)n处的第一个像素 - 它距离第一个原始像素有(1/4)n的距离,距离第二个原始像素有(3/4)n的距离。
如果我们想保持平滑图像,使用反比关系:将第一个像素的颜色值的(3/4)加上第二个像素的颜色值的(1/4),因为新像素中心在概念上更接近第一个原始像素中心(n/4),而不是第二个原始像素中心(3n/4)。
因此,人们不必真正丢弃数据 - 只需计算其邻居的适当比例(在概念空间中,总体图像的物理尺寸不会改变),这是一种平均而不是严格的跳过/丢弃。

在2D图像中,比例计算更加复杂,但本质相同。插值并从最近的原始“邻居”中拉取更多的值。如果下采样不是太严重,结果图像应该与原始图像非常相似。


1
非常好的答案,我需要纸和笔来跟着学习,但现在我想我已经明白了。但是,假设我们将网格大小除以某个偶数(2、4、8),使样本网格与旧像素网格完全对齐。那么,我是否总是从样本网格中每个单元格内的每个像素中取相等数量的像素数据? - Mizipzor
如果它是偶数,你可以取平均值。有许多不同的方法来缩放图像。 - Demi
1
另一种思考方式是以相同的概念方式来考虑,即物理尺寸不会改变,但像素的宽度会改变,而是考虑新像素消耗多少原始像素和每个像素的数量。这在偶数情况下非常有效(例如,从4个像素水平缩放到2个像素时,每个新像素将消耗两个旧像素-平均它们相等)。 - Demi

10
无论是放大还是缩小,实际上所进行的“插值”是重新采样。
如果缩小版本的样本数量不是全样本(像素等)的偶数因子,则简单地丢弃数据将产生采样误差,这会在图像中表现为“锯齿”。相反,如果你使用你提到的算法之一来插值新样本在现有样本之间的空间位置,结果会更加平滑。
你可以将此概念化为首先缩放到旧尺寸和新尺寸的最小公倍数,然后通过丢弃样本来缩小,只是没有实际生成中间结果。

但是仅仅通过丢弃数据来使用偶数除数(2、4、8)进行缩小也会产生采样误差,对吗? - Mizipzor
1
是的,这肯定不会与“实际”重新采样源数据相同。然而,插值“猜测”事物可能在哪里,但并不能保证它们实际上就在那里。如果您想要准确性,您需要重新采样原始数据。 - sybreon
2
“平均化”比丢弃更好——它可以产生更平滑的缩小结果。在某些情况下,当进行缩小操作时,会使用更复杂的滤波器来对点组进行加权处理。当对二维图像进行缩小时,你需要聚集许多点,而不仅仅是一些相邻的点。 - S.Lott

8
这个草图展示了一些像素的截面,初始为三个像素(黑色曲线),使用插值(蓝色曲线)将其降采样为两个像素(红色曲线)。插值是由原始的三个像素确定的,并且最终的两个像素被设置为每个最终像素中心处插值的值。(如果在这里不清楚,垂直轴显示的是单个颜色通道每个像素的强度。)alt text http://img391.imageshack.us/img391/3310/downsampling.png

你能恢复这张图片吗? - Brent Bradburn
@nobar:抱歉,我不知道图片去哪了,也没有五年前的备份。希望 Stack Overflow 或 Imageshack 能够恢复它... 你知道它失踪多久了吗?否则,我可能会有机会重新制作它,但现在我没有时间。 - tom10

7

这里您可以看到原始图像在顶部,然后是一个朴素的去除算法,在中间,最后是一个插值算法在底部。

考虑一个大的聚光灯。中心的光线最亮,边缘的光线变暗。当你把它照得更远时,你是否期望光束突然失去边缘的黑暗,变成一个光的实心轮廓?

不会的,同样的事情也发生在stackoverflow标志上。正如您在第一次缩小中看到的那样,图片失去了边缘的柔和感,看起来很可怕。第二次缩小通过平均像素周围的像素来保持边缘的平滑度。

一个简单的卷积滤波器供您尝试是将像素及其周围所有像素的RGB值相加,并进行简单的平均处理。然后用该值替换像素。然后您可以丢弃相邻的像素,因为您已经在中心像素中包含了该信息。

alt text


那么一个一维降采样算法,可以计算平均值,看起来像这样(6个点缩小到3个点):1,2,3,4,5,6 = (1+2)/2,(3+4)/2,(5+6)/2。对吗?在这里,示例网格在缩放期间包含两个点,但是我是否应该在更多方向上采样更多点呢? - Mizipzor
是的,你可以用那种方式做。通常来说,更多的样本意味着更好的图片,但你应该谨慎。远离新内核的像素通常对新像素的贡献要比靠近的像素少。 - Unknown
4
我觉得图片不见了。或者你真的想展示这个DVD封面的图像吗?能否请您重新发布这些图片?这将非常有帮助。 - Joerg
6
似乎Imgur将原始图片的URL分配给了另一张不相关的图片? - guillem

3
无论是放大还是缩小,我们都需要确定(在某种程度上准确)两个像素之间的点的颜色值是什么。让我们来看一行像素:
P     P     P     P     P     P     P     P     P

当我们进行上采样时,我们需要知道在中间点使用的像素值:
P   P   P   P   P   P   P   P   P   P   P   P   P

当我们进行下采样时,我们还需要知道在中间点使用的像素值:

P       P       P       P       P       P       P

当然,我们希望在二维空间中完成这个过程,而不是一维空间,但原理相同。
因此,无论如何,我们需要进行插值以确定正确的采样值。根据我们想要的结果精度,有不同的插值技术。理想情况下,我们会使用所有相关数学方法进行适当的重采样……但即使那也只是严谨地完成的插值!

3
如果您使用类似Lanczos的窗口Sinc滤波器,则会过滤掉在较低分辨率下无法表示的高频细节,而平均滤波器则不会做到这一点,从而导致图像出现伪影。Sinc滤波器还可以产生更清晰的图像,并且适用于上采样和下采样。
如果您使用Sinc滤波器对图像进行放大,然后将其缩小回原始大小,您将获得几乎完全相同的图像,而如果您只是在缩小时对像素进行平均,则会得到比原始图像稍微模糊的图像。如果您使用Fourier变换来调整大小,这正是窗口化的Sinc尝试近似的内容,您将获得完全相同的原始图像,除了四舍五入误差之外。
有些人不喜欢使用Sinc滤波器会在锐利边缘周围产生轻微振铃的效果。我建议对于缩小矢量图形,应该使用平均滤波器,而对于缩小照片,则应该使用Sinc滤波器。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接