我正在尝试实现一个双三次插值算法,以从高度图中重建更高分辨率的数据。经过一些失败和包含几乎无法理解的数学指令集(我已经有好几年没有学微积分了,我只记得基础知识),我找到了保罗·伯克(Paul Bourke)的文章“用于图像缩放的双三次插值”,其中包含了一个看起来相当简单易于实现的算法。http://paulbourke.net/texture_colour/imageprocess/
然而,与维基百科上的结果完全不同,它产生了这个结果(使用相同的输入数据):
是什么导致了错误,更重要的是 - 如何修复?
以下是PHP代码(是的,这可能应该 - 也将 - 在C中重新实现;当它开始工作时)。
然而,与维基百科上的结果完全不同,它产生了这个结果(使用相同的输入数据):
![enter image description here](https://istack.dev59.com/bDv5l.webp)
以下是PHP代码(是的,这可能应该 - 也将 - 在C中重新实现;当它开始工作时)。
class BicubicInterpolator
{
private $data;
public function Set_data($d)
{
$this->data=$this->denull($d);
}
public function Interpolate($dx,$dy)
{
$r=0;
for ($m=-1; $m<2; $m++)
for ($n=-1; $n<2; $n++)
$r+=$this->data[$m+1][$n+1] * $this->R($m-$dx) * $this->R($dy-$n);
return $r;
}
private function denull($d)
{
//Substituting null values with nearest known values as per "A Review of Some Image Pixel Interpolation Algorithms" by Don Lancaster (supposed to produce same output as example image)
if ($d[0][1]===null) for ($i=0; $i<4; $i++) $d[0][$i]=$d[1][$i];
if ($d[1][0]===null) for ($i=0; $i<4; $i++) $d[$i][0]=$d[$i][1];
if ($d[3][1]===null) for ($i=0; $i<4; $i++) $d[3][$i]=$d[2][$i];
if ($d[1][3]===null) for ($i=0; $i<4; $i++) $d[$i][3]=$d[$i][2];
return $d;
}
function R($x)
{
return ( $this->P($x+2)
- 4 * $this->P($x+1)
+ 6 * $this->P($x)
- 4 * $this->P($x-1) )/6;
}
function P($x)
{
if ($x>0) return $x*$x*$x;
return 0;
}