大多数插值算法(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像素阵列(又名图像)?
答案 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个值参与然后将像素的颜色与作为权重的参与相加,将它们组合成一个像素值并将其作为采样结果返回。
希望这有帮助。