图像插值就是利用已知邻近像素点的灰度值(或RGB图像中的三色值)来产生未知像素点的灰度值,以便由原始图像再生出具有更高分辨率的图像。图像插值常常用在图像的放缩,旋转等变换中。常用的插值运算有三种:最邻近插值、双线性插值和立方卷积插值(cubic运算)。假设变换(放缩,旋转等等)前的图像为S,变换后的图像为T。

1.最邻近插值

【基本思想】 变换后图像T中像素 ${p(x,y)}$ 映射在原图像S中的点为${p^{,}(x_{1},y_{1})}$,需要注意的是因为对图像做过变换,所以在原图像中不一定能找到某个像素点和其对应。那么这时候就利用其最近的像素点来填充变换后图像的像素点 ${p(x,y)}$。如下图所示,若要插值的点落在$(i, j)$ , $(i+1,j)$, $(i, j+1)$ , $(i+1,j+1)$ 。 四个点中间的区域,那么计算该点距离四点的位置来选择用哪个点的灰度来对目标点进行插值。下图中的青色虚线将该区域划分为四个部分,落在A,B,C,D四个区域分别用 $(i, j)$ , $(i+1,j)$, $(i, j+1)$ , $(i+1,j+1)$ 四个点的灰度进行插值。

这里写图片描述

这种方式计算简单,所以算法的时间复杂度低,实时性能得到了很好的保证。但是因为直接用邻近像素对变换后图像做填充,在放大图像时图像会出现明显的“马赛克”。特别图像的边缘有锯齿状。

2.双线性插值

【基本思想】 双线性插值并不简单的复制原图像某一个像素点来填充目标图像的像素点,而是将利用目标点映射到原图像中邻近的四个像素点的加权和来填充目标像素点。如下所示:

这里写图片描述

下图中横纵坐标表示的是图像的长度和宽度,Z轴表示的是像素点的灰度值。利用以下关系可以得到目标点的灰度计算公式:

$$ f(i, j+v) = [f(i, j+1) - f(i, j)]*v + f(i,j) $$

同理有:

$$ f(i+1, j+v) = [f(i+1, j+1) - f(i+1, j)]*v + f(i+1, j) $$

因此有: $$ f(i+u, j+v) = (1-u)(1-v)f(x,y)+(1-u)vf(i, j+1)+u(i-v)f(i+1,j)+uvf(i+1,j+1) $$ 利用上述关系就可以得到目标点的灰度值。相比邻近插值,双线性插值计算上比邻近插值复杂,但是在图像的边缘上明显要优于邻近插值运算的结果。

3.立方卷积插值

【基本思想】 利用插值函数: $$ f(x)=\frac{sinx}{x} $$ 的三次逼近结果对图像的像素点进行插值。三次逼近结果:

$$ S(x)= \begin{cases} 1-2|x|^{2} + |x|^3 & &(\text{|x| <1}) \\
4-8|x| + 5|x|^2 - |x|^3 & &(\text{1<|x|<2})\\
0& &(|x|>2) \end{cases} $$

目标像素的灰度值由邻近16个像素点的加权插值得到:

$$ g(x^{'}, y^{'})=f(u,v)=ABC \\
A=[s(1+b) \ \ s(b) \ \ s(1-b) \ \ s(2-b)] \\
C=[s(1+a) \ \ s(a) \ \ s(1-a) \ \ s(2-a)]^T \\
B= \left[ \begin{matrix} f([u]-1,[v]-1) & f([u-1],[v]) & f([u]-1,[v]+1) & f([u-1],[v]+2) \\
f([u],[v]-1) & f([u],[v]) & f([u],[v]+1) & f([u],[v]+2) \\
f([u]+1,[v]-1) & f([u]+1,[v]) & f([u]+1,[v]+1) & f([u]+1,[v]+2)\\
f([u]+2,[v]-1) & f([u]+2,[v]) & f([u]+2,[v]+1) & f([u]+2,[v]+2) \end{matrix} \right] $$

立方卷积插值运算计算量大,特别是浮点运算很占时间,然而其插值效果非常好,图像的边缘信息保留较好。

4.对比结果

邻近插值结果:

邻近插值结果

双线性插值结果:

双线性插值结果

立方卷积插值结果:

立方卷积插值结果