2

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

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

4

1 回答 1

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 个参与值。然后,您将参与的像素颜色作为权重相加,将它们组合成一个像素值并将其作为采样结果返回。

希望这可以帮助。

于 2013-03-28T05:50:11.883 回答