下面是关于双线性插值的经典说明图例:
转载请注明出处
首先,图中有5个像素点:
,
,
,
,
。其中四个红色点
是原图的点,绿色点
就有意思了,理解了它的含义,对双线性插值原理就能有一个概念上的理解。
这个点
,其实是目标图的像素点在原图上的投影!
我们先跳出来想一下:
- 双线性插值用来做什么?在CV领域,通常是用来改变原图的尺寸。
- 那么目标图的每个像素点的像素值应该取多少呢?双线性插值的思路是,对于目标图的每个像素点,找到它在原图上最相关的四个点通过插值计算得到它的像素值。
- 原图上哪四个点是最相关的呢?我们可以把目标图的点,投影回到原图上,投影点四周距离最近的四个原图点就是了。
回到上面的图例:
四个红色点
就是投影点
的四周最近的点。通过四个红色点
,可以计算出投影点
的像素值,这样目标图上的像素点的像素值也就得到了。
接下来就有两个问题。
目标图的点如何投影到原图上?
已知:
- 输入图的高和宽: ,
- 目标图的高和宽: ,
投影的公式是:
但是这个公式有一个问题,可能会导致目标图的中心跟原图的中心不对齐。例如:原图是3x3,中心点坐标(1, 1);目标图是9x9,中心点坐标(4, 4);通过上面的公式计算,目标图中心点在原图的投影坐标:
。
之所以会出现中心点不对齐,原因是每个像素点实际上是一个边长为1的正方形,所以对于坐标为(
,
)的像素点,它的中心其实是(
,
)。所以精确计算应该是:
转换一下得到正确的投影公式:
如何插值计算得到投影点的像素值?
已知:
- 四个红色点 的坐标值: , , ,
- 四个红色点 的像素值: , , ,
- 投影点 的坐标值: ,
思路是:每个
点的像素值乘以各自的权重,然后相加得到投影点
像素值。
点跟
点的距离越近,它的权重就越大。
双线性插值给出的算法很是简单粗暴:先在横轴方向上进行两次线性插值计算,然后在纵轴方向上进行一次插值计算。结合最开始那个图例看,就是先求
和
这两个蓝色点的像素值,然后再通过这两个值,求得
点的像素值。
具体计算如下:
前面说了,四个红色点
是投影点
四周最近的点,显然四个红色点彼此间的距离都是1,也即
,
。上式可以写成:
再令:
,
,式子可以进一步写成:
至此,关于双线性插值的原理就全部讲完了。
作者:Jinglever
链接:https://www.jianshu.com/p/29e5c84ea539
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。