文章目录
- 为什么需要双线性插值算法?
- 双线性插值算法是什么?
- 如何双线性插值?
- 结尾:喜欢的小伙伴可以点点关注+赞哦
为什么需要双线性插值算法?
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<x1且y0<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)=x1−x0x−x0∗f(x1,y0)+x1−x0x1−x∗f(x0,y0)f(x,y1)=x1−x0x−x0∗f(x1,y1)+x1−x0x1−x∗f(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)=y1−y0y1−y∗f(x,y0)+y1−y0y−y0∗f(x,y1)
大功告成,是不是很简单呢!
结尾:喜欢的小伙伴可以点点关注+赞哦
希望对各位小伙伴能够有所帮助哦,永远在学习的道路上伴你而行, 我是航火火,火一般的男人!