栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

matlab中interp2双线性插值算法的实现原理及使用python简单实现双线性插值interp2算法

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

matlab中interp2双线性插值算法的实现原理及使用python简单实现双线性插值interp2算法

双线性插值算法基本原理

双线性插值算法的基本原理:

图1 双线性插值示意图

图中绿色的点P为待插值得到的点,对点P进行插值需要用到Q11(x1,y1), Q12(x1,y2), Q21(x2, y1), Q22(x2, y2)的值,需要先在x方向线性插值得到R1(x,y1)与R2(x,y2):

公式1

再进一步再y方向上进行线性插值得到P(x,y):

公式2

这里不做详细讲述,提供几篇参考资料:

  1. 双线性插值
  2. 一篇文章为你讲透双线性插值
  3. 双线性插值算法以及python实现
matlab中interp2双线性插值算法的实现原理

matlab中提供的interp2算法为一种二维的插值算法,在插值方式上可以选择最邻近插值、双线性插值(默认插值方式)、样条插值、双三次插值等。这里仅考虑双线性插值。

Vq = interp2(X, Y, V, Xq, Yq)
X, Y 为原始坐标, 且X, Y 是必须是单调的
V为坐标X, Y对于的数据矩阵
Xq,Yq是用于插值的坐标
若Xq与Yq中有在X与Y范围之外的点,则相应地返回nan(Not a Number)

matlab中的interp2为基于网格的插值,不需要考虑参考资料3中的情况,所以直接按公式2计算即可。
不同于图1所画,matlab插值时是以坐标(1,1)的位置为原点,列方向为x方向,行方向为y方向。

python下简单实现双线性插值interp2算法

直接上代码:

def interp2(x,y,img,xi,yi):
    """
    x, y: 初始坐标
    img: 待插值图像
    xi, yi: 插值图像坐标

    使用双线性插值实现:
    -----------------------------
    | q11(x1, y1) | q12(x1, y2) |
    -----------------------------
    | q21(x2, y1) | q22(x2, y2) |
    -----------------------------
    f(x, y) = 1/(x2-x1)(y2-y1) * [f(x1,y1)*(x2-x)(y2-y)) + f(x1, y2)*(x2-x)(y-y1) + f(x2, y1)*(x-x1)(y2-y)
                + f(x2, y2)*(x-x1)(y-y1)]
    """

    img_itp = np.ones([len(xi), len(yi)])

    for i in range(len(x)-1):
        for j in range(len(y)-1) :
            y2_y1 = y[j+1] - y[j]
            x2_x1 = x[i+1] - x[i]
            for m in range(int(x[i]), int(x[i+1])):
                for n in range(int(y[j]), int(y[j+1])):
                    # x2 - x, x - x1, ...
                    x2_x = x[i+1] - xi[m]
                    x_x1 = xi[m] - x[i]
                    y2_y = y[j+1] - yi[n]
                    y_y1 = yi[n] - y[j]

                    # q11: img[j, i], q12: img[j, i+1], q21: img[j+1, i], q22: img[j+1, i+1]
                    img_itp[n, m] = (img[j, i] * y2_y * x2_x + 
                                img[j, i+1] * y2_y * x_x1 + 
                                img[j+1, i] * y_y1 * x2_x + 
                                img[j+1, i+1] * y_y1 * x_x1 ) / y2_y1 / x2_x1
 
    return img_itp
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/339027.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号