算法要点
一、基本原理
具体原理可以自行搜索,这里只大致描述一下,目标图像上某一个点按比例映射到原始图像上某一点,不过通常计算得到的原始点坐标不是整数,最近邻的做法是向下取整,而双线性差值的做法是取与该坐标最接近的上下左右四个点来线性加权,在放大的时候不会像最近邻那样锯齿严重,但是计算量会大不少。这里要注意的是加权分为两个维度,横向和纵向。此外,边界的处理也要注意。
二、优化思路
这里核心的优化思路有两点:
- 避免重复计算
- 浮点转定点
避免重复计算
首先要分析哪里存在可能的重复计算。resize是原始图像和目标图像之间的映射,这个映射不一定是一对一的。比如对于目标图像的高大于原始图像的高的情况,目标图像的多个行可能会映射到原始图像的同一行,这样我们就可以利用之前的计算结果,而不用重复计算。
对于目标图像上的某个点,映射到原始图像的坐标为O,相邻的四个点为ABCD,则目标图像的像素值为val = A(1-fx)(1-fy) + Bfx(1-fy) + C(1-fx)fy + Dfxfy
这个公式可以分解为两个过程:HResize和VResize
HResize
val0 = A(1-fx) + Bfx
val1 = C(1-fx) + Dfx
VResize
val = val0*(1-fy) + val1*fy
之所以分解为两步,是因为上面提到的当目标图像的多行映射到