サブピクセル補間は比較的単純です。通常、位相シフトが必要なサブピクセル イメージ シフトに対応する、一定の位相シフトを持つオールパス フィルターに相当するものを適用します。必要な画質に応じて、たとえば 5 ポイントのLanczosまたはその他のウィンドウ化された sinc 関数を使用し、X シフトまたは Y シフト、あるいはその両方が必要かどうかに応じて、これを一方または両方の軸に適用します。
たとえば、0.5 ピクセルのシフトの場合、係数は になります[ 0.06645, 0.18965, 0.27713, 0.27713, 0.18965 ]
。(係数は正規化されていることに注意してください。つまり、それらの合計は 1.0 に等しくなります。)
x - 2
水平シフトを生成するには、これらの係数を からまでx + 2
のピクセルで畳み込みます。
const float kCoeffs[5] = { 0.06645f, 0.18965f, 0.27713f, 0.27713f, 0.18965f };
for (y = 0; y < height; ++y) // for each row
for (x = 2; x < width - 2; ++x) // for each col (apart from 2 pixel border)
{
float p = 0.0f; // convolve pixel with Lanczos coeffs
for (dx = -2; dx <= 2; ++dx)
p += in[y][x + dx] * kCoeffs[dx + 2];
out[y][x] = p; // store interpolated pixel
}