最近将一个matlab程序转为c++,途中遇到interp2这个家伙,我是左查右查,发现网上没有人总结这个玩意,于是我来初探一下,还是别有洞天的,嘿嘿。
1、关于interp2
Vq = interp2(X,Y,V,Xq,Yq,'linear',0),X和Y表示采样点的坐标,可以是向量或者矩阵,比如我们要画一个网格,网格点坐标可以理解为采样点的坐标。Xq和Yq表示查询点的坐标,同样可以是向量或者矩阵,即我们需要插值的地方,当然它的步长小于或等于X和Y的步长,相当于对网格进行细化。V是采样点处的值。Vq即得到插值点处的值。感觉有点啰嗦,看下面的吧。
这个函数是干什么的呢?假设一幅灰度图像,坐标矩阵是X和Y,一个表示行,一个表示列,对应的像素值矩阵为V。现在在Xq和Yq处对它进行双线性插值,即返回新插值点的像素值矩阵Vq。
现在咱们看个列子:
第一幅图像是横纵坐标都为[-3,3],函数值为正态分布的立体图像。第二幅图像在第一幅图像基础上进行双线性插值得出的结果,从图中可以看出,其结构更加精细。
2、c++代码
在opencv函数库中,可以用remap函数来完成相同的功能。当然,在使用这个函数之前,你得完成opencv的配置。
src是源图像
dst是经过插值之后输出的目标图像
map1和map2是插值点坐标,类型为CV_16SC2,CV_32FC1和CV_32FC2,此处需注意,如果map1是(x,y)的形式,那么map2是空映射。
interpolation是插值方法的类型:INTER_NEAREST,INTER_LINEAR,INTER_AREA,INTER_CUBIC,INTER_LANCZOS4
。
intborderMode是边界模式,当borderMode=BORDER_TRANSPARENT时,目标图像对应源图像的外点不被修改。
borderValue,当边界是固定的时被使用,其值为0。
下面我们看一下这个函数的使用: