Субпиксельная интерполяция относительно проста.Как правило, вы применяете то, что составляет фильтр всех проходов с постоянным фазовым сдвигом, где фазовый сдвиг соответствует требуемому сдвигу субпиксельного изображения.В зависимости от требуемого качества изображения вы можете использовать, например, 5-точечную Lanczos или другую оконную функцию sinc, а затем применить ее по одной или обеим осям в зависимости от того, хотите ли вы сдвиг X или Y или оба.
Например, для сдвига в 0,5 пикселя коэффициенты могут быть [ 0.22954, 0.65507, 0.95725, 0.95725, 0.65507 ]
.Чтобы сгенерировать горизонтальный сдвиг, вы должны свести эти коэффициенты с пикселями от x - 2
до x + 2
, например,
const float kCoeffs[5] = { 0.22954f, 0.65507f, 0.95725f, 0.95725f, 0.65507f };
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
}