1.图像插值算法原理介绍
所谓插值算法,意思是在已有图片的情况下,在像素与像素之间插入新的像素,当然不止是用于像素插入使图像扩增,也可以用于图像缩放,那么新的像素怎么取值呢,下面介绍两种取值方法。
1.1最近邻插值算法
顾名思义,最近邻插值算法值的是插的新像素与和它最相邻像素的取值相同。
如上图所示,若插入的新像素位于P位置,可以看到Q11与它最近,所以f( P)=f(Q11)。
-
算法过程:
最近邻插值算法的过程是首先假设原图是一个像素大小为W×H的图片,缩放后的图片是一个像素大小为w×h的图片,这时候我们是已知原图中每个像素点上的像素值(即灰度值等)的(⚠️像素点对应像素值的坐标都是整数)。这个时候已知缩放后有一个像素点为(X,Y),想要得到该像素点的像素值,那么就要根据缩放比例去查看其对应的原图的像素点的像素值(x,y),然后将该像素值赋值给该缩放后图片的像素点(X,Y) -
缩放公式:
根据横轴,即宽可得:X/x = W/w
根据纵轴,即高可得:Y/y = H/h
那么能够得到 f(X,Y)= f( W/w × x, H/h ×y)
因此这个时候缩放后的图片像素点(x,y)的像素值就对应着原图像素点( W/w × x, H/h ×y)的像素值,若这个值非整数,则根据最近邻插值法,四舍五入取离这个值最近的整数作为最终结果。 -
举例说明:
-
放大图片的例子
若将1副3×3的图片放大的4×4,用f(x,y)表示目标图像,h(x,y)表示原图像。
则f(x,y)=h(3/4×x,3/4×y)
所以f(1,1)=h(0.75,0.75)=h(1,1),f(0,3)=h(0,2.25)=h(0,2) -
缩小图片的例子
若将1副5×5的图片缩小成3×3
则 f(x,y)=h(5/3×x,5/3×y)
所以,f(1,1)=h(5/3,5/3)=h(2,2), f(0,3)=h(0,5)
-
-
优缺点
这种方法的好处就是简单,但是坏处就是太过粗暴,会缺失精度,造成缩放后的图像灰度上的不连续,在变化地方可能出现明显块状效应,如下图所示:
1.2线性插值法
如图所示,我们已知(x0,y0),(x1,y1)和x,需要求得y的值
可以得到:
进而得到:
可以看到,y的值的求法是用x和x0,x1的距离作为一个权重,用于y0和y1的加权。
1.3双线性插值
双线性插值是线性插值在二维时的推广,其核心思想是在两个方向分别进行一次线性插值。
假如我们想得到未知函数 f 在点 P = (x, y) 的值,假设我们已知函数 f 在 Q11 = (x1, y1)、Q12 = (x1, y2), Q21 = (x2, y1) 以及 Q22 = (x2, y2) 四个