ねこでじ(Nekodigi)

Nekodigi’s diary

学習中の気づきをまとめています。応援よろしくお願いします

【Processing】Bicubic補間を実装する。

成果物

f:id:Nekodigi:20200312180411p:plain
入力したのは黒丸で囲われた11x11の点ですが、よく見ないと分からないほど綺麗に保管されています。Bicubic補間は、実際にGIMPなどの画像処理ソフトで標準的に使われています。

仕組み

Cubic Hermite Interpolationという三次式を2Dに拡張したものです。今回は、行列を使って計算しています。
Bicubic interpolation - Wikipedia
リンク先に良い解説があるので要点だけ解説します。
searchsortedという関数は、順番に並んだ配列で、入力した数値はどのIndexに挿入すればいいかを返す関数ですが、結果-1をすると、入力した数値の左のIndexを得られるのでこの性質を利用しています。また、サンプルをとる際の端の処理が長かったのでmin(),max()関数を使って簡潔に一定値に数値を収める処理をしています。
px = (x-x1)/(x2-x1);という部分は、セル上の座標を0~1の範囲に正規化するための処理です。リンク先に図があるので合わせてご覧ください。
コードのベースはこちらを参考にしています。
numpy - Bicubic interpolation Python - Stack Overflow
Wikipedia以上に洗練された方法がこちらで紹介されていたので、こちらの計算方法を利用しています。X-1の行列は記述ミスだと思われます。Y-1の行列の転置行列と同じになるのが正解です。
Wayback Machine

コード

行列の計算の実装は自力で行いました。見にくい部分もありますが、ご了承ください。
Bicubicという名前で追加しています。
github.com