简单的双三次图像插值算法



大多数插值算法(Lanczos, Hermite, Bicubic)使用非常简单的函数来计算一些值。但是这些值随后会通过一些非常复杂的函数发送,这些函数会发挥一些神奇的作用,瞧,图像被调整了大小。我想了解这个神奇的函数(窗口函数?),但我在Delphi, Pascal, PHP或简单的c++中找到的大多数代码都已经优化了,或者是一些大型库的一部分,并且使用了大量的子函数,类和其他东西。我只是想了解基本的。

例如,Delphi中"最近邻"的函数是:

function BoxFilter(Value: Single): Single;
begin
  if (Value > -0.5) and (Value <= 0.5) then
    Result := 1.0
  else
    Result := 0.0;
end;

我如何将这样的函数应用到我的二维像素数组(又名图像)?

首先需要实现大小调整函数。基本上,调整图像大小就是对图像重复采样,以获取与新图像像素对应的数据。比如说,您将一张101x101的图像调整为160*67。那么,目标图像(0,0)处的像素对应于源图像(0.0,0.0)处的采样,这就等于(0,0)处的像素。但是,假设(34,12)处的像素对应于源中的(34*100/159,12*100/66) == (21.38,18.18)位置,您必须对其进行采样。您所说的函数在结果中返回所选像素值的一部分,所提供的值等于所要求的采样减去该像素的相应坐标。例如,(4,3)处的像素将有一个0部分,因为该函数对该像素进行乘法运算,值为(21.38-4)和(18.18-3),两次都返回0。(21,18)处的像素将占1部分(其值的100%将添加到结果中),因为两次调用都将在-0.5 - 0.5区间内进行。

为了在不均匀坐标下正确地从图像中采样颜色,您取这些函数,然后将采样值四舍五入以检测中心像素,然后将该函数应用于它和8个周围像素,接收9个参与值。然后,将像素的颜色与参与度之和作为权重,将它们组合成一个像素值,并将其作为采样结果返回。

最新更新