首先举个例子说明插值过程,先看看matlab的插值函数 interp()
吧:
x = -2 : 1 : 2;
y = -2 : 1 : 2;
[X, Y] = meshgrid(x, y);
Z = -X.^2 - Y.^2;
p = -2 : 0.33 : 2;
q = -2 : 0.33 : 2;
[P, Q] = meshgrid(p, q);
V1 = interp2(X, Y, Z, P, Q, 'nearest'); % 最邻近插值
V2 = interp2(X, Y, Z, P, Q, 'linear'); % 双线性插值
V3 = interp2(X, Y, Z, P, Q, 'spline'); % 球面插值
figure
subplot(221)
surf(X, Y, Z);
colormap('autumn')
title('z = x^2 + y^2')
subplot(222)
surf(P, Q, V1);
colormap('autumn')
title('z = x^2 + y^2,最邻近插值')
subplot(223)
surf(P, Q, V2);
colormap('autumn')
title('z = x^2 + y^2,是双线性插值')
subplot(224)
surf(P, Q, V3);
colormap('autumn')
title('z = x^2 + y^2,球面插值')
我们先绘制一个粗糙的曲面,然后通过不同的方式插入一些点,得到的图像如下:
可见,不同的插值效果不一样,图一很粗糙,绘图点数少,图二为最邻近插值,得到类似 ‘阶跃’ 的效果,而图三图四的曲面过去看起来更加圆滑。类比到图像,使用最邻近插值得到的图像相当于把像素点放大了,而使用双线性插值和球面插值相当于让图像像素点之间过度更加平滑。
最近邻插值,是将距离目标点最近的像素点的值作为插值的值
如图为将一张MxN的图像src放大到PxQ的图像dst,我们要创建一个新的PXQ的数组,像素点中随便取一个点A(i, j),假设我们使用的灰度图,那么A点的灰度值应该是多少呢?
首先我们把P点的坐标映射到原图像中(不知道说映射贴不贴切