写opencv的时候用到了resize函数,
看到一个参数INTER_CUBIC
cv::InterpolationFlags::INTER_CUBIC
这个参数就是表示使用双立方插值的方式对图像进行缩放。
然后就去查了一下双立方插值算法。
然后说一下双立方插值怎么计算的:
1、
先给出一张图像src(原图像),大小假设为(m,n)
输出图像定义为dst
输出图像的大小定义为Size size(M,N)
2、
输出图像的dst(i,j)的值怎么计算呢?
首先我们判断一下缩放后的dst(i,j)在原图src中位置在哪?
可以按照计算方式:
float row = i*m/M;
float col = j*n/N;
这里计算出来的位置为(row,col),也就是dst(i,j)在原图中的位置的值是src(row,col),也就是dst(i,j) = src(row,col);
2、
但是row,col都是浮点数,那怎么计算src(row,col)这个值呢?
好吧,这个图1很多地方都有了,这里借用一下。图中暂且可以把p点认为是点(row,col),那这里就是要计算p点的值,
p点的值怎么计算呢,这里是取p点周围的16个像素,类似于下图1,
然后p点的值(影响因子w_ij乘以a_ij,然后求和):