如何以亚像素精度转换图像?

Tim*_*lus 5 graphics rendering image-processing subpixel

我有一个系统需要在屏幕上移动图像.我目前正在使用png并将其放置在所需的屏幕坐标处.

由于屏幕分辨率和所需帧速率的组合,一些帧是相同的,因为图像尚未移动整个像素.不幸的是,屏幕的分辨率是不可协商的.

我对子像素渲染如何平滑边缘有一个大致的了解,但我一直无法找到资源(如果存在)我如何使用着色来将图像转换少于一个像素.

理想情况下,这可以用于任何图像,但如果它只能用简单的形状像圆形或环形,那也是可以接受的.

Pau*_*l R 10

子像素插值相对简单.通常,您应用相当于具有恒定相移的全通滤波器,其中相移对应于所需的子像素图像偏移.根据所需的图像质量,您可以使用例如5点Lanczos或其他窗口sinc功能,然后根据您是要X换档还是Y换档或两者,将其应用于一个或两个轴.

例如,对于0.5像素的移位,系数可能是[ 0.22954, 0.65507, 0.95725, 0.95725, 0.65507 ].为了产生水平位移,你会卷积这些系数从像素x - 2x + 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
    }
Run Code Online (Sandbox Code Playgroud)

  • 系数应该加起来为1.0,因此您无需缩放结果.当然,系数将根据您需要的子像素偏移量而改变,硬编码它们就像在示例中一样不会很好.像bicubic这样的简单公式也适用于此应用程序. (2认同)