matlab函数interp2及其c++代码

最近将一个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。

    现在咱们看个列子:

    


   

matlab函数interp2及其c++代码_第1张图片

matlab函数interp2及其c++代码_第2张图片

第一幅图像是横纵坐标都为[-3,3],函数值为正态分布的立体图像。第二幅图像在第一幅图像基础上进行双线性插值得出的结果,从图中可以看出,其结构更加精细。

2、c++代码

    在opencv函数库中,可以用remap函数来完成相同的功能。当然,在使用这个函数之前,你得完成opencv的配置。


    src是源图像

    dst是经过插值之后输出的目标图像

    map1和map2是插值点坐标,类型为CV_16SC2CV_32FC1和CV_32FC2,此处需注意,如果map1是(x,y)的形式,那么map2是空映射。

    interpolation是插值方法的类型:INTER_NEAREST,INTER_LINEAR,INTER_AREA,INTER_CUBIC,INTER_LANCZOS4 。 

    intborderMode是边界模式,当borderMode=BORDER_TRANSPARENT时,目标图像对应源图像的外点不被修改。

    borderValue,当边界是固定的时被使用,其值为0。

    下面我们看一下这个函数的使用:

    

    结果如下:

        观察这个结果,你会惊奇的发现opencv中的remap函数真的实现了matlab中的interp2函数,欧耶,perfect!

  



你可能感兴趣的:(matlab,opencv,remap,interp2)