图形学初识--双线性插值算法

为什么需要双线性插值算法?

ChatGP回答: 双线性插值(bilinear interpolation)是一种常用的插值方法,用于在二维空间内估算未知点的值。它主要应用于图像处理、计算机视觉、地理信息系统(GIS)、数值分析和其他需要在二维数据中进行平滑过渡的领域。

白话解释: 在二维图像数据中,它的坐标都是整数,例如: ( 1 , 1 ) , ( 52 , 53 ) (1,1),(52,53) (1,1),(52,53)这种,但是如果在某种算法计算中,需要获取 ( 50.5 , 100.3 ) (50.5,100.3) (50.5,100.3) 类似这种坐标的像素值,常规就两种思路:

1、最近取值。这里就是直接取 ( 50 , 100 ) (50, 100) (50,100)​的像素值

2、邻近插值。这里就是利用 ( 50 , 100 ) , ( 51 , 100 ) , ( 50 , 101 ) , ( 51 , 101 ) (50, 100),(51, 100),(50, 101),(51, 101) (50,100),(51,100),(50,101),(51,101) 这几个坐标像素值的组合

上述的第二种思路: 其实就是双线性插值。

在本章节中,主要解决的问题就是: 大区域应用低分辨率纹理,避免过于离谱的马赛克(像素风)效果!

如下图: 左图就是最近邻取值,右图就是双线性插值!

在这里插入图片描述

双线性插值算法是什么?

已知图像的四个位置的像素值, f ( x 0 , y 0 ) = v 0 , f ( x 1 , y 0 ) = v 1 , f ( x 0 , y 1 ) = v 2 , f ( x 0 1 , y 1 ) = v 3 f(x_0, y_0) = v0, \quad f(x_1, y_0) = v1, \quad f(x_0, y_1) = v2, \quad f(x_01, y_1) = v3 f(x0,y0)=v0,f(x1,y0)=v1,f(x0,y1)=v2,f(x01,y1)=v3

计算 f ( x , y ) = ? ( x 0 < x < x 1 且 y 0 < y < y 1 ) f(x, y) = ? \quad (x_0 < x < x_1 \quad且\quad y_0 < y < y_1) f(x,y)=?(x0<x<x1y0<y<y1)

如何双线性插值?

问题描述: 已知直线起始端点 p 0 = ( x 0 , y 0 ) p_0 = (x_0, y_0) p0=(x0,y0) p 1 = ( x 1 , y 1 ) p_1 = (x_1, y_1) p1=(x1,y1) f ( p 0 ) = v 0 f(p_0) = v_0 f(p0)=v0 f ( p 1 ) = v 1 f(p_1) = v_1 f(p1)=v1,求直线上任意一点 p = ( x , y ) p=(x,y) p=(x,y) f ( p ) = ? f(p) = ? f(p)=?

如下图所示:

在这里插入图片描述

双线性插值指两次线性插值: 可以先插值x再插值y,也可以先插值y再插值x。咱们这里先x,再y。

1、连接 ( x 0 , y 0 ) 和 ( x 1 , y 0 ) (x_0, y_0)和(x_1,y_0) (x0,y0)(x1,y0) ( x 0 , y 1 ) 和 ( x 1 , y 1 ) (x_0, y_1)和(x_1,y_1) (x0,y1)(x1,y1), 将 ( x , y ) (x,y) (x,y) 投影到两条两条直线上,交点分别为: ( x , y 0 ) 和 ( x , y 1 ) (x,y_0)和(x,y_1) (x,y0)(x,y1)

如下图所示:

在这里插入图片描述

咱们分别计算: f ( x , y 0 ) 和 f ( x , y 1 ) f(x, y_0)和f(x,y_1) f(x,y0)f(x,y1)
f ( x , y 0 ) = x − x 0 x 1 − x 0 ∗ f ( x 1 , y 0 ) + x 1 − x x 1 − x 0 ∗ f ( x 0 , y 0 ) f ( x , y 1 ) = x − x 0 x 1 − x 0 ∗ f ( x 1 , y 1 ) + x 1 − x x 1 − x 0 ∗ f ( x 0 , y 1 ) f(x, y_0) = \frac{x-x_0}{x_1-x_0} * f(x_1, y_0) + \frac{x_1-x}{x_1-x_0} * f(x_0, y_0)\\ f(x, y_1) = \frac{x-x_0}{x_1-x_0} * f(x_1, y_1) + \frac{x_1-x}{x_1-x_0} * f(x_0, y_1) f(x,y0)=x1x0xx0f(x1,y0)+x1x0x1xf(x0,y0)f(x,y1)=x1x0xx0f(x1,y1)+x1x0x1xf(x0,y1)

这里的思路就不用解释了吧,前面文章关于直线线性插值已经讲过了,不懂的小伙伴可以回去翻翻哦!

2、通过 f ( x , y 0 ) 和 f ( x , y 1 ) f(x,y_0)和f(x,y_1) f(x,y0)f(x,y1)​ 的值,再做一次插值得到 f ( x , y ) f(x,y) f(x,y)

f ( x , y ) = y 1 − y y 1 − y 0 ∗ f ( x , y 0 ) + y − y 0 y 1 − y 0 ∗ f ( x , y 1 ) f(x,y) = \frac{y_1 - y}{y_1-y_0} * f(x,y_0) + \frac{y - y_0}{y_1-y_0} * f(x,y_1) f(x,y)=y1y0y1yf(x,y0)+y1y0yy0f(x,y1)

大功告成,是不是很简单呢!

结尾:喜欢的小伙伴可以点点关注+赞哦

希望对各位小伙伴能够有所帮助哦,永远在学习的道路上伴你而行, 我是航火火,火一般的男人!

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值