经过线性插值后,新图像每个像素值来自于原图像像素点的组合插值。
简单的斜率公式可知。
经过合并同类项后得到
已知 y 求 x 的过程与以上过程相同,只是 x 与 y 要进行交换。
由于像素间距离
双线性插值
在两个方向分别进行一次线性插值
我们以一个例子来介绍双线性插值原理:假如我们想得到未知函数f在点P=f(x, y)的值,设f在Q11=(x1, y1),Q12=(x1, y2),Q21=(x2,y1),Q22=(x2,y2)四个点的值。
首先在x方向上面线性插值,得到R2、R1:
, Where
, Where
然后以R2,R1在y方向上面再次线性插值:
这样就得到所要的结果 f(x, y)
因为双线性插值只会使用相邻的四个点,因此分母总是1,可以约取。
由于插值点不一定是整数,例如点(1.2, 3.4), 其相邻的四个点分别为(1.3)(2.3)(1.4)(2.4)
f(i+u, j+v) = (1-u)(1-v)f(i,j) + u(1-v)f(i+1,j)+(1-u)vf(i,j+1)+uvf(i+1,j+1)
给定一个矩阵(图片本身就是一种矩阵),将1个 3 ∗ 3 尺寸的矩阵使用最近邻插值法到 4 ∗ 4
源图像与目标图像坐标的对应关系如下式
dst[0,1]对应的src位置如下:
src_x = 0 * (3 / 4) = 0
src_y = 1 * (3 / 4) = 0.75
u=0,v=0.75
得到的对应于源图的坐标是(0 , 0.75), 这其实只是一个概念上的虚拟象素,实际在源图中并不存在这样一个象素,那么目标图的象素(0,1)的取值不能够由这个虚拟象素来决定,而只能由源图的这四个象素共同决定:(0,0)(0,1)(1,0)(1,1),
而由于(0,0.75)离(1,0)要更近一些,那么(1,0)所起的决定作用更大一些。
dst[0,1]=(1−0)(1−0.75)∗src[1,1]+(1−0)∗0.75∗src[1,0]+0∗(1−0.75)∗src[0,1]+0∗0.75∗src[0,0]
= 11 + 50 = 61
算法优化(待了解)
源图像和目标图像几何中心的对齐
SrcX=(dstX+0.5) * (srcWidth/dstWidth) -0.5
SrcY=(dstY+0.5) * (srcHeight/dstHeight)-0.5
代码实现
图像中的每个值都是通过双线性插值的方法得到的,首先生成一个空的目标图像大小的矩阵,然后往里面填值。
计算在源图上四个近邻点的位置
src_x = (dst_x + 0.5) * scale_x - 0.5
src_y = (dst_y + 0.5) * scale_y - 0.5
计算在源图上四个近邻点的位置
src_x_0 = int(np.floor(src_x))
src_y_0 = int(np.floor(src_y))
src_x_1 = min(src_x_0 + 1, src_w - 1)
src_y_1 = min(src_y_0 + 1, src_h - 1)
参考链接:https://zhuanlan.zhihu.com/p/49832048
参考链接:https://blog.csdn.net/siyue0211/article/details/92660001
参考链接:https://blog.csdn.net/m0_37799466/article/details/103890049
————————————————
版权声明:本文为CSDN博主「imxlw00」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/imxlw00/article/details/118118003