将原始图像放大到 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
分辨率。
处理目标图像的所有像素
所以 2 嵌套 for 循环通过 x1,y1
覆盖 xs1,ys1
为每个像素计算源图像中的浮动位置
x0 = x1*(xs0-1)/(xs1-1)
y0 = y1*(ys0-1)/(ys1-1)
从 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
) 以避免访问冲突。
最近学习了双线性插值,根据wiki上的描述,感觉双线性插值只能用于整数倍放大,比如给定4x4分辨率的图像,通过双线性插值,只能放大到8x8、12x12、16x16……等等,但不能放大到9x9、13x13……就因为9、13这样的数字不能被4整除,对吧?如果不对,如何通过双线性插值放大到n倍,其中n不是整数?
不,这是不对的。 您可以从任何正分辨率调整到任何其他分辨率。所以假设源图像是 xs0,ys0
并且目标是 xs1,ys1
分辨率。
处理目标图像的所有像素
所以 2 嵌套 for 循环通过
x1,y1
覆盖xs1,ys1
为每个像素计算源图像中的浮动位置
x0 = x1*(xs0-1)/(xs1-1) y0 = y1*(ys0-1)/(ys1-1)
从 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
) 以避免访问冲突。