最近傍補間とは1次元以上の多変量補間を行う最もシンプルな方法です。最も近くにある既知の値と全く同じ値で補間を行います。噛み砕いて言えば、富士山の地点1が標高$z_1$、地点3が$z_3$の時、その間にある地点2の標高はどのくらいか推定する方法の一種。
理論
補間
補間のゴールは一様サンプリングされた画素$v_{m, n}$を持つ画像$v$が与えられた時、下記の条件を満足する関数$u(x, y)$を見つけることである。
v_{m, n} = u(m, n) \quad for\, all\, m, n\in\mathbb Z
また、線形補間はサンプル$v$を関数$u:=Z(v)$に写す線形演算子$Z$として抽象的に記述することができる。ここで$Z$に二つの性質を定義する。
- $S_{k, l}:=v_{m-k, n-l}$
$S_{k, l}$はシフトを表す。ここで全ての$v$と$(k, l)$に対して$Z$はshift-invariantと呼ばれる。
Z(S_{k, l}(v))(x, y)=Z(v)(x-k, y-l)
- $v^{N}$は$v$に対する集合${-N, ...,+N}^2$の制約で$Z$は全ての$v$と$(x, y)$に対して局所的と言われる。
Z(v)(x, y)=lim_{N\rightarrow \infty}Z(v^N)(x,y)
もし$Z$が線形、shit-invariant、$l^\infty(\mathbb Z^2)$から$L^\infty(\mathbb R^2)$の中で局所的な時、Z(v)が畳み込みとしてかけるような補間カーネル$K$が存在する。
Z(v)(x,y)=\Sigma_{m,n\in Z}v_{m,n}K(x-m, y-n)
最近傍補間
最近傍補間の場合、関数$u(x, y)$は次式で表される。
u(x, y) = v_{[x], [y]}
ここでvは入力画像でu(x, y)は補間後の関数、[.]は最も近い整数に丸めることを示す。
補間カーネル$K(x,y)$は
K(x,y)=K_1(x)K_1(y),\quad K_1(t)=\left\{
\begin{array}{ll}
1 & if\, -\frac{1}{2}\leq t<\frac{1}{2} \\
0 & otherwise
\end{array}
\right.
実装方法
既知のデータを入力
point:地点
height:標高
point = [1, 2, 3, 4, 5]
height = [9, 18, 7, 5, 13]
現状わかっている山の外観
import matplotlib.pyplot as plt
plt.scatter(point, height, c="red", label="known")
plt.xlabel("Point")
plt.ylabel("Height")
plt.legend()
plt.grid()
標高を推定する地点の用意
import numpy as np
between = np.linspace(min(point), max(point), 100)
補間
equation = lambda x, y: interpolate.interp1d(x, y, kind="nearest")
interpolation = equation(point, height)
推定した山の標高
plt.plot(between, interpolation(between), c="green", label="estimate")
plt.scatter(point, height, c="red", label="known")
plt.xlabel("Point")
plt.ylabel("Height")
plt.grid()
参考文献
Pascal Getreuer(2011). Linear Methods for Image Interpolation