常见图像插值算法的原理与C++实现 插值法的原理( 二 )

(y0)[x1] + w3 * A.ptr(y1)[x1]);
3. 双三次插值
双三次插值使用浮点型坐标点周围4*4个整型点的像素值来计算其像素值 , 如下图所示:

常见图像插值算法的原理与C++实现  插值法的原理

文章插图
浮点型坐标点的插值为其周围4*4整型坐标点像素值的加权和:
其中权重W(i,j)的计算如下式 , 其中a取值范围-1~0之间 , 一般取固定值-0.5 。
常见图像插值算法的原理与C++实现  插值法的原理

文章插图
双三次插值的实现代码如下 。
首先是权重函数的实现:
float cubic_coeff(float x, float a){if(x <= 1){return 1-(a+3)*x*x+(a+2)*x*x*x;}else if(x < 2){return -4*a+8*a*x-5*a*x*x+a*x*x*x;}return 0.0;}
接着是权重系数的计算实现:
void cal_cubic_coeff(float x, float y, float *coeff){/*calc the coeff*/float u = x - floor(x);float v = y - floor(y);u += 1;v += 1;float a = -0.15;float a_mul_4 = (a + a) + (a + a);float a_mul_5 = a_mul_4 + a;float a_mul_8 = a_mul_4 + a_mul_4;float a_add_3 = a + 3;
常见图像插值算法的原理与C++实现  插值法的原理

文章插图
float a_add_2 = a + 2;float A[4];A[0] = cubic_coeff(abs(u), a);A[1] = cubic_coeff(abs(u-1), a);A[2] = cubic_coeff(abs(u-2), a);A[3] = cubic_coeff(abs(u-3), a);for (int s = 0; s < 4; s++){float C = cubic_coeff(abs(v-s), a);coeff[s*4] = A[0]*C;coeff[s*4+1] = A[1]*C;coeff[s*4+2] = A[2]*C;coeff[s*4+3] = A[3]*C;}}

最后 , 是双三次插值代码:
uchar cubic_inner(Mat A, float x_float, float y_float, float a){float coeff[16];cal_cubic_coeff(x_float, y_float, coeff);//计算权重系数float sum = 0.0;int x0 = floor(x_float) - 1;int y0 = floor(y_float) - 1;for(int i = 0; i < 4; i++){for(int j = 0; j < 4; j++){sum += coeff[i*4+j]*A.ptr(y0+i)[x0+j];}}uchar inner_value = http://www.kingceram.com/post/(uchar)sum;return inner_value;}
【常见图像插值算法的原理与C++实现插值法的原理】从插值效果来说:双三次插值>双线性插值>最邻近插值 , 从计算复杂度来说 , 同样是:双三次插值>双线性插值>最邻近插值 。所以实际使用时 , 根据自己的需要选择合适的插值算法 。