1 .数学模型 对于一个目的像素,其坐标通过反向变换得到的在原图中的浮点坐标为(i+u ,j+v ),其中i、j 均为非负整数,u 、v 为[0,1)区间的浮点数,双三次插值考虑一个浮点坐标(i+u ,j+v )周围的16 个邻点,目的像素值f(i+u ,j+v )可由如下插值公式得到: f(i+u ,j+v ) = [A] * [B] * [C] [A]=[ S(u + 1) S(u + 0) S(u - 1) S(u - 2) ] ┏ f(i-1, j-1) f(i-1, j+0) f(i-1, j+1) f(i-1, j+2) ┓ [B]=┃ f(i+0, j-1) f(i+0, j+0) f(i+0, j+1) f(i+0, j+2) ┃ ┃ f(i+1, j-1) f(i+1, j+0) f(i+1, j+1) f(i+1, j+2) ┃ ┗ f(i+2, j-1) f(i+2, j+0) f(i+2, j+1) f(i+2, j+2) ┛ ┏ S(v + 1) ┓ [C]=┃ S(v + 0) ┃ ┃ S(v - 1) ┃ ┗ S(v - 2) ┛ ┏ 1-2*Abs(x )^2+Abs(x )^3 , 0<=Abs(x )<1 S(x )={ 4-8*Abs(x )+5*Abs(x )^2-Abs(x )^3 , 1<=Abs(x )<2 ┗ 0 , Abs(x )>=2 S(x )是对 Sin(x *Pi)/x 的逼近(Pi 是圆周率——π ),为插值核。 2 .计算流程 1. 获取 16 个点的坐标P1、P2……P16 2. 由插值核计算公式S(x ) 分别计算出 x 、y 方向的插值核向量 Su 、Sv 3. 进行矩阵运算,得到插值结果 iTemp1 = Su 0 * P1 + Su 1 * P5 + Su 2 * P9 + Su 3 * P13 iTemp2 = Su 0 * P2 + Su 1 * P6 + Su 2 * P10 + Su 3 * P14 iTemp3 = Su 0 * P3 + Su 1 * P7 + Su 2 * P11 + Su 3 * P15 iTemp4 = Su 0 * P4 + Su 1 * P8 + Su 2 * P12 + Su 3 * P16 iResu lt = Sv 1 * iTemp1 + Sv 2 * iTemp2 + Sv 3 * iTemp3 + Sv 4 * iTemp4 4. 在得到插值结果图后,我们发现图像中有“毛刺”,因此对插值结果做了个后处理,即:设该点在原图中的像素值为pSrc,若 abs(iResu lt - pSrc) 大于某阈值,我们认为插值后的点可能污染原图,因此用原像素值pSrc 代替。 3 . 算法优化 由于双三次插值计算一个点的坐标需要其周围16 个点,更有多达20 次的乘法及15 次的加法,计算量可以说是非常大,势必要进行优化。 我们选择了 Intel 的SSE2 优化技术,它只支持在 P4 及以上的机器。测试当前 CPU 是否支持 SSE2,可由CPUID 指令得到,代码为: BOOL g_bSSE2 = FALSE; __asm { mov eax,...