对双线性插值的理解

1、应用场景

当需要将图像从一个分辨率变换到另一个分辨率时,双线性插值是常用的插值方法之一。

比如我们原图像为3 * 3的尺寸,要将其放大到4 * 4的新尺寸上。在填充新尺寸每一个像素点的时候,我们需要等比例计算该像素点在原图像中的位置,并获取该位置的rgb值。但在换算位置完成时,可能会得到一个浮点数,像素是不可能出现浮点数的,这时候我们会根据计算所得的像素点周围四个真实像素点的值来计算浮点数坐标的像素值。下面来一起看计算过程吧。
我们会根据下图来举例说明在这里插入图片描述

2、关于坐标的转化

我们可以使用比例的方法来计算新图像上的坐标在原图像中的对应位置。

横向的比例因子:原始图像的宽度 / 新图像的宽度 = 3 / 4

​纵向的比例因子:原始图像的高度 / 新图像的高度 = 3 / 4

新图像中(2,3)在原图像中对应的位置就是(2*(3/4),3*(3/4)),也就是(1.5,2.25)。
但在原图中找不到这个浮点数坐标的。这时候我们可以通过对该像素值周围的像素进行加权平均来生色值。
(1.5,2.25)周围四个像素点坐标分别为:

-注:Math.floor 为js中向下取整的接口,Math.celi则为向上取整

  • 左上:(Math.floor(1.5), Math.floor(2.25)) = (1,2)
  • 右上:(Math.celi(1.5), Math.floor(2.25)) = (2,2)
  • 左下:(Math.floor(1.5), Math.celi(2.25)) = (1,3)
  • 右下:(Math.celi(1.5), Math.celi(2.25)) = (2,3)

现在我们知道要根据上面四个像素点的值来计算我们想要的色值。

3、如何来根据四个坐标计算呢?

首先说一下如何计算:

根据目标像素在这四个最近像素中的位置,计算出目标像素与这些像素之间的相对距离,并根据这些距离计算出相应的权重,使用这些权重对四个最近像素的像素值进行加权平均,得出目标像素的值。

下面是一个简化后的图像,我们只关注浮点数坐标点和其周围四个整数做标点。在这里插入图片描述

思路:过o做垂直线,垂直于x轴,我们得到c0和c1两个交点。这时候我们用单线性插值分别c0和c1的值,拿到以后,根据c0和c1再来用线性插值计算o的值。

计算o点的值,我们可以拆分为三个步骤:
首先约定W(1,2)为(1,2)点的色值,Wc0 为c0点的色值,以此类推。

  • 计算c0点的值:这时候三个点y都是2,我们只关注x值。这时候Wc0 = W(2,2)(1.5-1)+W(1,2)(2-1.5)—这里其实就是让左侧点对应的值 * C0到右侧点的距离+右侧点对应的值 * C0到左侧点的位置,(换成白话就是离得越近的点权重越大,离得越远的权重越小),这里就是单线性插值的权重体现。 换为表达式就是Wc0 = W(x1,y0) * (x - x0) + W(x0,y0) * (x1 - x)
  • 计算c1点的值 同上,Wc1 = W(2,3)(1.5-1)+W(1,3)(2-1.5),换为表达式就是Wc1 = W(x1,y1) * (x - x0) + W(x0,y1) * (x1 - x)
  • 根据计算所得的c0,c1的值,来计算目标值。这时候y值变化,x的值就不变了。W(1.5,2.25)=Wc1 * (2.25-2)+Wc0 * (3-2.25), 换为表达式就是W(x,y) = Wc1 * (y-y0) + Wc0 * (y1-y)

上面三步就获取到了W(x,y)的值。将表达式合并就是:

W(x,y) = (W(x1,y1) * (x - x0) + W(x0,y1) * (x1 - x)) * (y-y0) + (W(x1,y0) * (x - x0) + W(x0,y0) * (x1 - x)) * (y1-y)
注: 加粗部分就是我们上边一二步求出的Wc0和Wc1,只是将三个表达式合在一起。
拆开得到:W = W(x1,y1) * (x-x0) * (y-y0) + W(x0,y1) * (x1-x)*(y-y0) + W(x1,y0) * (x-x0) * (y1-y) + W(x0,y0) * (x1-x)(y1-y)
上面加粗只是为了隔开字符,避免视觉疲劳。

至此,完成了双线性插值。

4、扩展

但是每次计算都这样计算表达式吗?也不用,来找找规律吧!
首先再来看张图:

在这里插入图片描述

W = W(x1,y1) * (x-x0) * (y-y0) + W(x0,y1) * (x1-x)*(y-y0) + W(x1,y0) * (x-x0) * (y1-y) + W(x0,y0) * (x1-x)(y1-y)

依然拆开看:
W(x1,y1)后面的乘值为 (x-x0) * (y-y0) ,这不正是W(x1,y1) * S2么, 再来做个验证,
W(x0,y1) * (x1-x)(y-y0) 依然等于W(x1,y1) * S1!
所以我们可以直接四个点对应的权重就是通过目标点分割后该点相对于目标点对面的
小矩形的面积。
同样的,在我们做单线行插值运算的时候计算的是通过目标点分割后该点相对于目标点对面的
线段*的长度 。

多了个参数,将一维变成二维了,哈哈。

  • 24
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值