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

时间:2013-03-27 23:23:08

标签: php algorithm delphi interpolation

大多数插值算法(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;

如何将这样的函数应用于我的2D像素阵列(又名图像)?

1 个答案:

答案 0 :(得分:5)

首先需要实现调整大小功能。基本上调整图像大小是重复对图像进行采样,以获得与新图像像素对应的数据。比如,您将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个值参与然后将像素的颜色与作为权重的参与相加,将它们组合成一个像素值并将其作为采样结果返回。

希望这有帮助。