将原始图像放大到 n 倍时,如何在调整图像大小时使用双线性插值,其中 n 不是整数

How to use bilinear interpolation on resizing image when enlarge the original image to n times, where n is not integer

最近学习了双线性插值,根据wiki上的描述,感觉双线性插值只能用于整数倍放大,比如给定4x4分辨率的图像,通过双线性插值,只能放大到8x8、12x12、16x16……等等,但不能放大到9x9、13x13……就因为9、13这样的数字不能被4整除,对吧?如果不对,如何通过双线性插值放大到n倍,其中n不是整数?

不,这是不对的。 您可以从任何正分辨率调整到任何其他分辨率。所以假设源图像是 xs0,ys0 并且目标是 xs1,ys1 分辨率。

  1. 处理目标图像的所有像素

    所以 2 嵌套 for 循环通过 x1,y1 覆盖 xs1,ys1

  2. 为每个像素计算源图像中的浮动位置

    x0 = x1*(xs0-1)/(xs1-1)
    y0 = y1*(ys0-1)/(ys1-1)
    
  3. 从 4 个邻居进行双线性插值

    x0,y0 的整数部分指向起点,小数部分是您的插值参数 tx,ty ...因此在源 (x0,y0),(x0+1,y0),(x0,y0+1),(x0+1,y0+1) 之间插入像素并将结果存储在目标图像中(x1,y1)。以不同方式处理边缘像素 (x0==xs0-1 , y0==ys0-1) 以避免访问冲突。