バイリニア補間

数学において、**バイリニア補間**（バイリニアほかん、双線形補間、）とは、反復線形補間を用いて2変数（例えば*x*と*y*）の関数を補間する方法である。
通常は2次元の上でサンプリングされた関数に適用されるが、任意の凸四辺形（のポリゴンメッシュ）の頂点上に定義された関数にも一般化できる。

バイリニア補間は、まずひとつの方向に線形補間を行い、次に別の方向に線形補間を行う。
各ステップはサンプリング値と位置について線形だが、補間全体は線形ではなく、サンプリング位置についての2次関数になる。

バイリニア補間は、コンピュータービジョンと画像処理における基本的な再サンプリング手法の 1 つで、**バイリニアフィルタリング**または**バイリニアテクスチャマッピング**とも呼ばれる。

## 計算

点 (*x*, *y*) における未知の関数*f* の値を求めるとする。
4つの点
*Q*11 = (*x*1,&nbsp;*y*1)、*Q*12 = (*x*1,&nbsp;*y*2)、 *Q*21 = (*x*2,&nbsp;*y*1)、*Q*22 = (*x*2,&nbsp;*y*2)
における*f* の値は既知であると仮定する。

### 線形補間の反復
まず*x*方向に線形補間を行う。以下を得る。
:\begin{align}
  f(x, y_1) = \frac{x_2-x}{x_2-x_1} f(Q_{11}) + \frac{x-x_1}{x_2-x_1} f(Q_{21}) \\
  f(x, y_2) = \frac{x_2-x}{x_2-x_1} f(Q_{12}) + \frac{x-x_1}{x_2-x_1} f(Q_{22})
\end{align}

望ましい推定値を得るために、 *y*方向に補間する。
:\begin{align}
  f(x,y) &= \frac{y_2-y}{y_2-y_1} f(x, y_1) + \frac{y-y_1}{y_2-y_1} f(x, y_2) \\
         &= \frac{y_2-y}{y_2-y_1} \left( \frac{x_2-x}{x_2-x_1} f(Q_{11}) + \frac{x-x_1}{x_2-x_1} f(Q_{21}) \right) +
            \frac{y-y_1}{y_2-y_1} \left( \frac{x_2-x}{x_2-x_1} f(Q_{12}) + \frac{x-x_1}{x_2-x_1} f(Q_{22}) \right) \\
         &\begin{aligned}[b]
= \frac{1}{(x_2-x_1)(y_2-y_1)} ( &f(Q_{11})(x_2-x)(y_2-y) + f(Q_{12})(x_2-x)(y-y_1)\\
& + f(Q_{21})(x-x_1)(y_2-y) + f(Q_{22})(x-x_1)(y-y_1))
\end{aligned} \\
         &= \frac{1}{(x_2-x_1)(y_2-y_1)} \begin{bmatrix} x_2-x & x-x_1 \end{bmatrix} \begin{bmatrix} f(Q_{11}) & f(Q_{12}) \\ f(Q_{21}) & f(Q_{22}) \end{bmatrix} \begin{bmatrix}
y_2-y \\ y-y_1 \end{bmatrix}
\end{align}

なお、最初に*y*方向に沿って補間を行い、次に*x*方向に沿って補間を行った場合も同じ結果が得られる
。

### 多項式のあてはめ
別の方法としては、補間問題の解を多重線形多項式として記述することである。

:f(x, y) \approx a_{00} + a_{10}x + a_{01}y + a_{11}xy
ここで、係数は連立1次方程式を解くことによって求められる。

:\begin{align}
\begin{bmatrix}
1 & x_1 & y_1 & x_1 y_1 \\
1 & x_1 & y_2 & x_1 y_2 \\
1 & x_2 & y_1 & x_2 y_1 \\
1 & x_2 & y_2 & x_2 y_2 
\end{bmatrix}\begin{bmatrix}
a_{00}\\a_{10}\\a_{01}\\a_{11}
\end{bmatrix} = \begin{bmatrix}
f(Q_{11})\\f(Q_{12})\\f(Q_{21})\\f(Q_{22})
\end{bmatrix}
\end{align}

以下の結果を得る。
:\begin{align}
\begin{bmatrix}
a_{00}\\a_{10}\\a_{01}\\a_{11}
\end{bmatrix} = \frac{1}{(x_2-x_1)(y_2-y_1)}\begin{bmatrix}
x_2y_2 & -x_2y_1 & -x_1y_2 & x_1y_1 \\
-y_2 & y_1 & y_2 & -y_1 \\
-x_2 & x_2 & x_1 & -x_1 \\
1 & -1 & -1 & 1 
\end{bmatrix}\begin{bmatrix}
f(Q_{11})\\f(Q_{12})\\f(Q_{21})\\f(Q_{22})
\end{bmatrix}
\end{align}

### 加重平均

解は*f*(*Q*)の加重平均として表すこともできる。
:f(x, y) \approx w_{11} f(Q_{11}) + w_{12} f(Q_{12}) + w_{21} f(Q_{21}) + w_{22} f(Q_{22})

ここで重みの合計は1であり、以下の転置連立1次方程式を満たす。
:
  \begin{bmatrix}
    1       & 1         & 1         & 1         \\
    x_1     & x_1       & x_2       & x_2       \\
    y_1     & y_2       & y_1       & y_2       \\
    x_1y_1  & x_1y_2    & x_2y_1    & x_2y_2
\end{bmatrix}
\begin{bmatrix}
    w_{11} \\ w_{12} \\ w_{21} \\ w_{22}
\end{bmatrix} =
\begin{bmatrix}
    1 \\ x \\ y \\ xy
\end{bmatrix}


以下の結果を得る。
:\begin{align}
\begin{bmatrix}
w_{11}\\w_{21}\\w_{12}\\w_{22}
\end{bmatrix} = \frac{1}{(x_2-x_1)(y_2-y_1)}\begin{bmatrix}
x_2y_2 & -y_2 & -x_2 & 1 \\
-x_2y_1 & y_1 & x_2 & -1 \\
-x_1y_2 & y_2 & x_1 & -1 \\
x_1y_1 & -y_1 & -x_1 & 1 
\end{bmatrix}\begin{bmatrix}
1\\x\\y\\xy
\end{bmatrix}
\end{align}
これは次のように単純化される。
:\begin{align}
  w_{11} &= \frac{(x_2 - x  )(y_2 - y  )}{(x_2 - x_1)(y_2 - y_1)} \\
  w_{12} &= \frac{(x_2 - x  )(y   - y_1)}{(x_2 - x_1)(y_2 - y_1)} \\
  w_{21} &= \frac{(x   - x_1)(y_2 - y  )}{(x_2 - x_1)(y_2 - y_1)} \\
  w_{22} &= \frac{(x   - x_1)(y   - y_1)}{(x_2 - x_1)(y_2 - y_1)}
\end{align}
これは、線形補間を繰り返して得られた結果と一致している。
重みの集合は、矩形のの集合として解釈することもできる。

### 行列形式
上記を組み合わせることで以下を得る。
:\begin{align}
f(x,y) \approx \frac{1}{(x_2-x_1)(y_2-y_1)}
\begin{bmatrix}f(Q_{11}) & f(Q_{12}) & f(Q_{21}) & f(Q_{22})\end{bmatrix}\begin{bmatrix}
x_2y_2 & -y_2 & -x_2 & 1 \\
-x_2y_1 & y_1 & x_2 & -1 \\
-x_1y_2 & y_2 & x_1 & -1 \\
x_1y_1 & -y_1 & -x_1 & 1 
\end{bmatrix}\begin{bmatrix}
1\\x\\y\\xy
\end{bmatrix}
\end{align}

### 単位正方形上のバイリニア補間
*f*が既知である4点 (0,&nbsp;0), (0,&nbsp;1), (1,&nbsp;0), (1,&nbsp;1) の座標系を選択すると、補間式は次のように簡略化される。
:f(x, y) \approx f(0, 0) (1 - x)(1 - y) + f(0, 1) (1 - x)y + f(1, 0) x(1 - y) + f(1, 1) xy 

行列表現は：
:f(x, y) \approx \begin{bmatrix} 1 - x & x \end{bmatrix} \begin{bmatrix} f(0, 0) & f(0, 1) \\ f(1, 0) & f(1, 1) \end{bmatrix} \begin{bmatrix} 1 - y \\ y \end{bmatrix}

加重平均とする場合、重みは：
:\begin{align}
  w_{11} &= (1 - x)(1 - y) \\
  w_{12} &= (1 - x)y \\
  w_{21} &= x(1 - y) \\
  w_{22} &= xy
\end{align}

多重線形多項式とする場合は：
:f(x, y) = a_{00} + a_{10}x + a_{01}y + a_{11}xy
ただし
:\begin{align}
  a_{00} &= f(0, 0) \\
  a_{10} &= f(1, 0) - f(0, 0) \\
  a_{01} &= f(0, 1) - f(0, 0) \\
  a_{11} &= f(1, 1) - f(1, 0) - f(0, 1) + f(0, 0)
\end{align}

いずれの場合も、定数の数(4)は、*f* が与えられたデータポイントの数に対応している。

### 畳み込み
画像などの直交格子（英語: cartesian grid）が対象の場合、バイリニア補間は、次のカーネル関数との畳み込みを適用することで求めることもできる

。

W(x) = 
\begin{cases}
 1-|x| & \text{for } |x| \leq 1 \\
 0     & \text{otherwise}
\end{cases}


以下は各方式のカーネル関数の比較である。

## 性質

バイリニア補間は、名前が示すように線形*ではない*が、*x*または*y*方向に平行な線に沿う（*x*または*y*が一定である）場合は線形（つまりアフィン）である。その他の直線に沿う場合は、補間は2次関数になる。
補間は位置（*x*と*y*）に関しては線形*ではない*が、上記の（行列）式に見られるように、ある固定点では補間値に対して線形*である*。

バイリニア補間の結果は、どの軸を最初に補間し、どの軸を次に補間するかには依存しない。
最初に*y*方向の線形補間を行い、次に*x*方向の線形補間を行った場合も、得られる近似値は同じになる。

補間関数は双線形多項式であり、ラプラス方程式を満たす調和関数でもある。
そのグラフはバイリニアベジェ曲面パッチである。

## 逆変換と一般化
一般に補間式は、（双曲線の枝を形成する）無限個の点において、（頂点値の凸包内の）任意の値をとるため、補間は可逆ではない。

しかし、ベクトル場を補間する場合など、バイリニア補間を2つの関数に同時に適用すると、補間は（特定の条件下で）可逆になる。
特に、この逆補間は、任意の凸四辺形内の点の「単位正方形座標」を（四辺形の座標を単位正方形上でバイリニア補間されるベクトル場と見なすことによって）導出するために使用できる。
この手順を使用すると、バイリニア補間を任意の凸四辺形に拡張できるが、平行四辺形でない場合は計算が大幅に複雑になる。
結果として得られる四辺形間の写像は*バイリニア変換*、*バイリニアワープ*、*バイリニア歪み*として知られている。

あるいは、四辺形と単位正方形の間のホモグラフィを使用することもできるが、補間結果はバイリニアにはならない。

四辺形が平行四辺形である特殊なケースでは、単位正方形への線形写像が存在し、一般化が容易である。

バイリニア補間を3次元に拡張したものはトリリニア補間と呼ばれる。

F は \mu, \lambda \in [0,1] によってパラメータ化された単位正方形上でバイリニア補間されたベクトル場とする。
補間を逆変換するには、2つのバイリニア多項式方程式を解く必要がある。
A + B\lambda + C\mu + D\lambda\mu = 0
ただし
\begin{align}
A &= F_{00} - F \\
B &= F_{10} - F_{00} \\ 
C &= F_{01} - F_{00} \\
D &= F_{11} - F_{01} - F_{10} + F_{00}
\end{align}
方程式と慎重に選ばれたベクトルの2次元クロス積 (グラスマン積を参照) を取ると、次の項を消去できる。
\begin{align}
(A + B\lambda + C\mu) &\times D &= 0 \\
(A + B\lambda) &\times (C + D\lambda) &= 0 \\
(A + C\mu) &\times (B + D\mu) &= 0 \\
\end{align}
次のように展開される。
\begin{align}
c + e\lambda + f\mu &= 0 \\
b + (c + d)\lambda + e\lambda^2&= 0 \\
a + (c - d)\mu + f\mu^2&= 0 \\
\end{align}
ただし
\begin{align}
a &= A \times B \\
b &= A \times C \qquad d = B \times C \\
c &= A \times D \qquad e = B \times D \qquad f = C \times D
\end{align}
2次方程式は二次方程式の解の公式を用いて解くことができる。同値な行列式は以下の通りである。
\mathbb{D} = (c + d)^2 -4eb = (c - d)^2 - 4fa
解は以下の通り（線形関係により、符号反転が強制される）。
\lambda = \frac{-c -d \pm\sqrt{\mathbb{D}}}{2e} \qquad \mu = \frac{-c +d \mp\sqrt{\mathbb{D}}}{2f}
条件 e=0 と f=0 は分離して扱う必要がある。
適切な条件が与えられれば、2つの解のうちの1つは単位正方形内に存在するはずである。

## 画像処理への応用

コンピュータビジョンと画像処理において、バイリニア補間は画像やテクスチャのリサンプリングに用いられる。
ひとつのアルゴリズムを用いて、画面上のピクセル位置がテクスチャマップ上の対応する点にマッピングされる。
周囲の4つのテクセルの属性（色、透明度など）の加重平均が計算され、画面上のピクセルに適用される。
テクスチャリングされるオブジェクトを構成する各ピクセルに対して、このプロセスが繰り返される
。

画像を拡大する必要がある場合、元の画像の各ピクセルを、拡大倍率に基づいて特定の方向に移動する必要がある。
しかし、非整数倍に画像を拡大すると、適切なピクセル値が割り当てられないピクセル（つまり、*穴*）が発生する。
この場合、出力画像に値が設定されていないピクセルが含まれないように、これらの*穴*に適切なRGB値またはグレースケール値を割り当てる必要がある。

バイリニア補間は、ピクセルマッチングによる完全な画像変換が不可能な場合に使用でき、適切な輝度値を計算してピクセルに割り当てることができる。
最近傍補間やバイキュービック補間などの他の補間手法とは異なり、バイリニア補間では特定のピクセルから対角方向に位置する最も近い4つのピクセルの値のみを使用して、そのピクセルの適切な色輝度値を求める。

バイリニア補間では、未知のピクセルの計算位置を囲む、既知のピクセル値の最も近い2×2近傍が考慮される。
そして、これら4つのピクセルの加重平均を計算し、最終的な補間値が求められる

。

### 例
右の例に示すように、行20.2、列14.5のピクセルの強度値は、まず行20と行21それぞれについて、列14と列15の値の間を線形補間することによって計算され、次のように表される。
:\begin{align}
  I_{20, 14.5} &= \frac{15 - 14.5}{15 - 14} \cdot 91 + \frac{14.5 - 14}{15 - 14} \cdot 210 = 150.5 \\
  I_{21, 14.5} &= \frac{15 - 14.5}{15 - 14} \cdot 162 + \frac{14.5 - 14}{15 - 14} \cdot 95  = 128.5
\end{align}

次に、これらの値の間を線形補間すると、
:I_{20.2, 14.5} = \frac{21 - 20.2}{21 - 20} \cdot 150.5 + \frac{20.2 - 20}{21 - 20} \cdot 128.5 = 146.1

サイズ変更された画像の一部のピクセルが他のピクセルよりも大きく表示される最近傍補間とは対照的に、
このアルゴリズムでは、画像が非整数倍率にサイズ変更されることによって発生する視覚的な歪みの一部が軽減される。

## 式の簡略化

この例は、表形式の圧力 (列) と温度 (行) のデータ（ある変数に対する参照としての）を示している。

:\begin{array}
\bcancel{{}_T \quad {}^P}
     &    P_1 & P_x    & P_2
\\
\hline
 T_1 & V_{11} & V_{1x} & V_{12} 
\\
 T_x &        & V_{xx} &
\\
 T_2 & V_{21} & V_{2x} & V_{22} 
\end{array}

次の標準的な計算には27の演算が含まれる。
:\begin{align}
I_{T_1, P_1-P_2} &= \frac{P_2 - P_x}{P_2 - P_1} \cdot V_{11} + \frac{P_x - P_1}{P_2 - P_1} \cdot V_{12} = V_{1x} \\
I_{T_2, P_1-P_2} &= \frac{P_2 - P_x}{P_2 - P_1} \cdot V_{21} + \frac{P_x - P_1}{P_2 - P_1} \cdot V_{22} = V_{2x} \\
I_{P_x, T_1-T_2} &= \frac{T_2 - T_x}{T_2 - T_1} \cdot V_{1x} + \frac{T_x - T_1}{T_2 - T_1} \cdot V_{2x} = V_{xx}
\end{align}
上記にはいくつかの繰り返し操作がある。
例えば (P_2 - P_1)、(P_x - P_1)、(P_x - P_1)、(T_2 - T_1)、およびいくつかの除算。
これらの繰り返しには、単一の補間を計算する際に一時変数を割り当てることができるため、演算回数は19に減る。

これを、最初の19の個別演算から、次のように17の個別演算に簡略化できる。
:V_{xx} = \frac{[(P_2 - P_x) \cdot V_{11} + (P_x - P_1) \cdot V_{12}] \cdot (T_2 - T_x) + [(P_2 - P_x) \cdot V_{21} + (P_x - P_1) \cdot V_{22}] \cdot (T_x - T_1)}{(P_2 - P_1) \cdot (T_2 - T_1)}

式の簡略化は、数学的手法を工学アプリケーションに適用するための良い方法であり、プロセスの計算およびエネルギー要件を低減することがでる。

## 関連項目

* 画像スケーリング
* 最近傍補間
* バイキュービック補間
* 
* 
* 
* 
*  - 三角形または四面体内の補間用

## 脚注