3. 双三次插值
双三次插值使用浮点型坐标点周围4*4个整型点的像素值来计算其像素值 , 如下图所示:
文章插图
浮点型坐标点的插值为其周围4*4整型坐标点像素值的加权和:
其中权重W(i,j)的计算如下式 , 其中a取值范围-1~0之间 , 一般取固定值-0.5 。
文章插图
双三次插值的实现代码如下 。
首先是权重函数的实现:
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;
文章插图
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
【常见图像插值算法的原理与C++实现插值法的原理】从插值效果来说:双三次插值>双线性插值>最邻近插值 , 从计算复杂度来说 , 同样是:双三次插值>双线性插值>最邻近插值 。所以实际使用时 , 根据自己的需要选择合适的插值算法 。
- 常见干燥剂及干燥气体 常见干燥剂
- 常见的 *** 连接设备有哪些?
- 常见小区绿化100种植物 树的作用
- 北方常见蜘蛛图鉴 北方常见蜘蛛
- 养狗知识金毛
- 请问专家,常见的有机磷农药都有哪些?
- 家里养个金毛好不好
- 刘宇宁点赞最多的抖音,抖音中的喜欢那些人物图像怎么删掉?
- 茄科类植物有哪几个 茄科类植物有哪些
- 洗衣机坏了怎么办?西门子洗衣机常见故障维修 西门子洗衣机维修