二维插值在图像处理和数据可视化方面有着很重要的应用。在MATLAB中可以用函数interp2进行二维插值。该函数的一般语法格式为:
ZI = interp2(X,Y,Z,XI,YI,method)
其中,Z是一个矩形数组,包含二维函数的值,X和Y为大小相同的数组,包含相对于Z的给定值。XI和YI为包含插值点数据的矩阵,method表示插值方法,为可选参数。
MATLAB中提供了3种不同的插值方法可进行二维插值。
最近邻插值(method='nearest'):该方法用分段常数曲面拟合数据,插值点的值是最近点的值;
双线性插值(method='linear'):该方法用双线性曲面拟合数据点。插值点的值是4个最近点的值的组合。本方法是分段双线性的,比双三次插值法快,并且占用的内存更少;
双三次插值(method='cubic'):该方法用双三次曲面拟合数据点。插值点的值是16个最近点的值的组合。本方法是分段3次的,结果的平滑性比前面两种方法都好。

图4-1 低分辨率的peaks函数图形图4-1 低分辨率的peaks函数图形所有这些方法都要求X和Y数据是单调的,即从点到点,要么总是递增的,要么总是递减的。应该用meshgrid函数处理这些矩阵。另外,每种方法都会在插值之前自动将输入映射到等间隔的区域中。
【例10】基于一个77矩阵的数据比较二维插值方法。
(1)生成低分辨率的peaks函数图形。
code.matlab
>> [x,y] = meshgrid(-3:1:3);
>> z = peaks(x,y);
>> surf(x,y,z)
生成结果如图4-1所示。
(2)生成一个精度更高的网格,为插值做准备。
code.matlab
>> [xi,yi] = meshgrid(-3:0.25:3);
(3)最近邻插值。
code.matlab
>> zi1 = interp2(x,y,z,xi,yi,'nearest');
(4)线性插值。
code.matlab
>> zi2 = interp2(x,y,z,xi,yi,'bilinear');
(5)双三次插值。
code.matlab
>> zi3 = interp2(x,y,z,xi,yi,'bicubic');
(6)比较不同插值方法得到的曲面图,如图4-2所示。
\[\]
图4-2 用不同插值方法得到的曲面图
(7)比较不同插值方法得到的等值线图,如图4-3所示。
\[\]
图4-3 用不同方法得到的等值线图