高さマップから高解像度データを再構築するために、バイキュービック補間アルゴリズムを実装しようとしています。いくつかの失敗とほとんど理解できない数学を含む一連の指示の後(微積分を持ってから数年が経ち、基本を超えてあまり覚えていません)、PaulBourkeによる記事「画像スケーリングのためのバイキュービック補間」に何が含まれているのかを見つけましたかなり単純で実装が簡単なアルゴリズムのように見えました。http://paulbourke.net/texture_colour/imageprocess/
ただし、ウィキペディアの結果にリモートで似ている補間結果を生成する代わりに、(同じ入力データから)次のように取得します。
エラーの原因は何ですか?さらに重要なのは、エラーを修正する方法です。
以下の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;
}