【问题标题】:Simple bicubic image interpolation algorithm? [closed]简单的双三次图像插值算法? [关闭]
【发布时间】:2013-03-27 23:23:07
【问题描述】:

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

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

【问题讨论】:

  • 不清楚您的实际问题是什么。例如,在您的第一段中,您抱怨“非常复杂的功能”,但您没有充分描述它们以理解您的抱怨。
  • @comingstorm 我发现的函数大小为 20kB+。分析和理解基础知识的内容非常多。所以我想简单解释一下如何使用我上面写的过滤器功能。

标签: php algorithm delphi interpolation


【解决方案1】:

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

希望这会有所帮助。

【讨论】:

  • 非常感谢!根据您的解释,我设法编写了一个可以进行 Hermite 和最近邻重采样的重采样器!代码大约有 15 行长(而我在网上找到的源代码大小约为 20kB,并进行了各种优化和其他东西——真的很难理解基础知识)。
猜你喜欢
  • 2013-02-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-02-28
  • 1970-01-01
  • 2018-09-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多