文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

基于Python如何实现二维图像双线性插值

2023-07-02 09:04

关注

本篇内容主要讲解“基于Python如何实现二维图像双线性插值”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“基于Python如何实现二维图像双线性插值”吧!

在对二维数据进行 resize / mapping / 坐标转换等操作时,经常会将原本的整数坐标变换为小数坐标,对于非整数的坐标值一种直观有效的插值方式为双线性插值。

插值简介

双线性插值,又称为双线性内插。在数学上,双线性插值是有两个变量的插值函数的线性插值扩展,其核心思想是在两个方向分别进行一次线性插值。

双线性插值作为数值分析中的一种插值算法,广泛应用在信号处理,数字图像和视频处理等方面。

假设我们出现了需要在四个相邻正方形整数点(A,B,C,D)坐标中间(正方形范围内)选择一个点(a,b)取近似值的情形。

此时我们已知的是四个点的数值VA,VB,VC,VD,给定小数坐标E(a,b),0≤a,b≤1,如何插值求解E点的数值呢,解决类似问题的方法统称为插值,上图展示公式为双线性插值的计算方法。

最近邻法 (Nearest Interpolation)

一种最简便的方法为最近邻法,直接取与当前点距离最近的点的值作为插值结果:

基于Python如何实现二维图像双线性插值

其中 roundroundround 为四舍五入的取整操作,方法简便速度极快,但往往不够精细

双三次插值 (Bicubic interpolation)

双三次插值是用原图像中16(4*4)个点计算新图像中1个点,效果比较好,但是计算代价过大。

双线性插值 (Bilinear Interpolation)

使用一个点进行插值过于粗暴,16个点又过于繁琐,那就使用EEE点周围4个点的数值来近似求解,这是一种平衡了计算代价和插值效果的折中方案,也是各大变换库的默认插值操作。

双线性插值

通过观察上述动图(可以动手挪一挪)可以清晰地看到,双线性插值本质就是把四个角落的数值按照正方形面积的比例线性加权后的结果。

好吧一句话已经把数学的核心部分讲完了

那么既然理解了本质,数学公式就好写了:

基于Python如何实现二维图像双线性插值

python实现

在实现时当然 for 循环大法可以解决一切问题,但总归是不太优雅,我们尝试使用 numpy 操作完成双线性插值

假设原始图像 image,变换后的小数坐标 X 矩阵 x_grid,Y 矩阵 y_grid,那么可以使用如下的 bilinear_by_meshgrid 函数快速双线性插值,已经处理好了边界,可以放心使用。

def bilinear_by_meshgrid(image, x_grid, y_grid):    #               Ia, Wd                          Ic, Wb    #           (floor_x, floor_y)              (ceil_x, floor_y)       #    #                               (x, y)    #    #               Ib , Wc                         Id, Wa    #           (floor_x, ceil_y)               (ceil_x, ceil_y)       #    assert image.shape == x_grid.shape == y_grid.shape    assert image.ndim == 2    H, W = image.shape[:2]    floor_x_grid = np.floor(x_grid).astype('int32')    floor_y_grid = np.floor(y_grid).astype('int32')    ceil_x_grid = floor_x_grid + 1    ceil_y_grid = floor_y_grid + 1    if np.max(ceil_x_grid) > W -1 or  np.max(ceil_y_grid) > H -1 or np.min(floor_x_grid) < 0 or np.min(floor_y_grid) < 0:        print("Warning: index value out of original matrix, a crop operation will be applied.")        floor_x_grid = np.clip(floor_x_grid, 0, W-1).astype('int32')        ceil_x_grid = np.clip(ceil_x_grid, 0, W-1).astype('int32')        floor_y_grid = np.clip(floor_y_grid, 0, H-1).astype('int32')        ceil_y_grid = np.clip(ceil_y_grid, 0, H-1).astype('int32')    Ia = image[ floor_y_grid, floor_x_grid ]    Ib = image[ ceil_y_grid, floor_x_grid ]    Ic = image[ floor_y_grid, ceil_x_grid ]    Id = image[ ceil_y_grid, ceil_x_grid ]    wa = (ceil_x_grid - x_grid) * (ceil_y_grid - y_grid)    wb = (ceil_x_grid - x_grid) * (y_grid - floor_y_grid)    wc = (x_grid - floor_x_grid) * (ceil_y_grid - y_grid)    wd = (x_grid - floor_x_grid) * (y_grid - floor_y_grid)    assert np.min(wa) >=0 and np.min(wb) >=0 and np.min(wc) >=0 and np.min(wd) >=0        W = wa + wb + wc + wd    assert np.sum(W[:, -1]) + np.sum(W[-1, :]) == 0        wa[:-1, -1] = ceil_y_grid[:-1, -1] - y_grid[:-1, -1]    wb[:-1, -1] = y_grid[:-1, -1] - floor_y_grid[:-1, -1]        wb[-1, :-1] = ceil_x_grid[-1, :-1] - x_grid[-1, :-1]    wd[-1, :-1] = x_grid[-1, :-1] - floor_x_grid[-1, :-1]        wd[-1, -1] = 1        W = wa + wb + wc + wd    assert np.max(W) == np.min(W) == 1        res_image = wa*Ia + wb*Ib + wc*Ic + wd*Id    return res_image

该函数集成在我自己的python库 mtutils 中,可以通过:

pip install mtutils

直接安装,之后可以直接引用:

from mtutils import bilinear_by_meshgrid

到此,相信大家对“基于Python如何实现二维图像双线性插值”有了更深的了解,不妨来实际操作一番吧!这里是编程网网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯