这里是引用https://www.cnblogs.com/amarr/p/10565188.html
本文章根据引用的文章,对三种插值方法进行简单的总结与介绍,并介绍一种插值方法,通过C语言实现。

最近邻插值

最简单的插值方法,顾名思义,选取距离自己最近的一个点的像素值赋给自己。如图所示:关于双三次插值,双线性插值,最近邻插值算法介绍、插值方法介绍以及C语言实现(一)
假设P点为带求像素,其在放大区域的坐标为(X,Y),其x方向和y方向的放大倍数为kx,ky,通过x/kx,y/ky,则在原图像的映射坐标为(x+u,y+v).其中,x,y为整数部分,u,v为小数部分,根据x,y可以求得距离他最近的四个点的坐标,通过u,v可以求得距离他最近的一个点的坐标。(因为在c语言中,除法是整除,小数部分直接舍去,所以不能一步直接求得距离最近的点)。
最近邻插值法的计算量小,但是最后生成的图像的像素值不连续,在像素值变化较大的地方尤其明显。

双线性插值

即在x方向和y方向分别进行一次线性插值。
具体实现方法如下:关于双三次插值,双线性插值,最近邻插值算法介绍、插值方法介绍以及C语言实现(一)

假设P点为带求像素,其在放大区域的坐标为(X,Y),其x方向和y方向的放大倍数为kx,ky,通过x/kx,y/ky,则在原图像的映射坐标为(x+u,y+v).其中,x,y为整数部分,u,v为小数部分,根据x,y可以求得距离他最近的四个点的坐标。

设P点坐标为:
P=(x+u,y+v)
则:
Q12=(x,y); Q22=(x+1,y); Q11=(x,y+1); Q22=(x+1,y+1)
以上为程序设计思路。

我们先设P=(x,y)
我们先通过x1,x2,y1,y2表示他们。
关于双三次插值,双线性插值,最近邻插值算法介绍、插值方法介绍以及C语言实现(一)
首先,我们在x方向插值,得到R1和R2的值:
关于双三次插值,双线性插值,最近邻插值算法介绍、插值方法介绍以及C语言实现(一)
再在y方向进行插值:
关于双三次插值,双线性插值,最近邻插值算法介绍、插值方法介绍以及C语言实现(一)
最后得到结果:
关于双三次插值,双线性插值,最近邻插值算法介绍、插值方法介绍以及C语言实现(一)关于双三次插值,双线性插值,最近邻插值算法介绍、插值方法介绍以及C语言实现(一)
双线性插值法的计算比最邻近点插值复杂,计算量较大但是图像的插值像素值比较连续,结果基本令人满意。它具有低通滤波性质,使高频分量受损,图像轮廓可能会有一点模糊。

双三次插值算法

这里是引用https://blog.csdn.net/Cody_/article/details/102674514

该算法的具体原理比较复杂,想要深究的可以查看相关论文。

简单来说,双三次插值法,就是通过找到距离待求点P的最近的16个像素点,通过16个像素点的加权平均得到,需要两个多项式插值函数,每个方向使用一个。

假设源图像A大小为mn,缩放K倍后的目标图像B的大小为MN,即K=M/m。A的每一个像素点是已知的,B是未知的,我们想要求出目标图像B中每一像素点(X,Y)的值,必须先找出像素(X,Y)在源图像A中对应的像素(x,y),再根据源图像A距离像素(x,y)最近的16个像素点作为计算目标图像B(X,Y)处像素值的参数,利用BiCubic基函数求出16个像素点的权重,图B像素(x,y)的值就等于16个像素点的加权叠加。
关于双三次插值,双线性插值,最近邻插值算法介绍、插值方法介绍以及C语言实现(一)
根据比例关系x/X=m/M=1/K,我们可以得到B(X,Y)在A上的对应坐标为A(x,y)=A(X*(m/M),Y*(n/N))=A(X/K,Y/K)。如图所示P点就是目标图像B在(X,Y)处对应于源图像A中的位置,P的坐标位置会出现小数部分,所以我们假设 P的坐标为P(x+u,y+v),其中x,y分别表示整数部分,u,v分别表示小数部分(蓝点到a11方格中红点的距离)。那么我们就可以得到如图所示的最近16个像素的位置,在这里用a(i,j)(i,j=0,1,2,3)来表示,如上图。
关于双三次插值,双线性插值,最近邻插值算法介绍、插值方法介绍以及C语言实现(一)
我们要做的就是求出BiCubic函数中的参数x,从而获得上面所说的16个像素所对应的权重W(x)。BiCubic基函数是一维的,而像素是二维的,所以我们将像素点的行与列分开计算。BiCubic函数中的参数x表示该像素点到P点的距离,例如a00距离P(x+u,y+v)的距离为(1+u,1+v),因此a00的横坐标权重i_0=W(1+u),纵坐标权重j_0=W(1+v),a00对B(X,Y)的贡献值为:(a00像素值)* i_0* j_0。因此,a0X的横坐标权重分别为W(1+u),W(u),W(1-u),W(2-u);ay0的纵坐标权重分别为W(1+v),W(v),W(1-v),W(2-v);B(X,Y)像素值为:

关于双三次插值,双线性插值,最近邻插值算法介绍、插值方法介绍以及C语言实现(一)

插值方法

假设该图像有n行m列,总像素为nm,x方向和y方向各自扩大kx和ky倍,则:
1.在每行的开头插入u个像素,结尾插入v个像素,在1~(n-1)的每个像素的后面插入(kx-1)个像素,则。
n+u+(kx-1)
(n-1)+v=kxn-kx+1+u+v=kxn,则1+u+v=kx
2.在每列的开头插入u个像素,结尾插入v个像素,在1~(n-1)的每个像素的后面插入(ky-1)个像素,则。
n+u+(ky-1)(n-1)+v=kyn-k+1+u+v=ky*n,则1+u+v=ky

具体代码实现见P2

关于双三次插值,双线性插值,最近邻插值算法介绍、插值方法介绍以及C语言实现(二)

相关文章: