iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > Python >基于Python如何实现二维图像双线性插值
  • 106
分享到

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

2023-07-02 09:07:43 106人浏览 独家记忆

Python 官方文档:入门教程 => 点击学习

摘要

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

本篇内容主要讲解“基于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如何实现二维图像双线性插值”有了更深的了解,不妨来实际操作一番吧!这里是编程网网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

    --结束END--

    本文标题: 基于Python如何实现二维图像双线性插值

    本文链接: https://www.lsjlt.com/news/340716.html(转载时请注明来源链接)

    有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

    本篇文章演示代码以及资料文档资料下载

    下载Word文档到电脑,方便收藏和打印~

    下载Word文档
    猜你喜欢
    • 基于Python实现二维图像双线性插值
      目录插值简介最近邻法 (Nearest Interpolation)双三次插值 (Bicubic interpolation)双线性插值 (Bilinear Interpolatio...
      99+
      2024-04-02
    • 基于Python如何实现二维图像双线性插值
      本篇内容主要讲解“基于Python如何实现二维图像双线性插值”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“基于Python如何实现二维图像双线性插值”吧!在对二维数据进行 resize / ma...
      99+
      2023-07-02
    • C++ OpenCV如何实现图像双三次插值算法
      本篇内容主要讲解“C++ OpenCV如何实现图像双三次插值算法”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“C++ OpenCV如何实现图像双三次插值算法”吧!一、图像双三...
      99+
      2023-06-21
    • 基于Python实现在线二维码生成工具
      目录1.环境搭建2.二维码生成功能的封装3.网页应用的搭建在今天的教程中,费老师我将为大家展示如何通过纯Python编程的方式,开发出一个网页应用,从而帮助用户直接通过浏览器访问,即...
      99+
      2024-04-02
    • 如何基于python和Matplotlib绘制函数的等高线与三维图像
      这篇文章主要介绍了如何基于python和Matplotlib绘制函数的等高线与三维图像,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。本例绘制的函数为:1. 网格点&e...
      99+
      2023-06-26
    • 详解Python查找算法的实现(线性,二分,分块,插值)
      目录1. 线性查找2. 二分查找3. 插值查找4. 分块查找5. 总结查找算法是用来检索序列数据(群体)中是否存在给定的数据(关键字),常用查找算法有: 线性查找:线性查找也称为顺序...
      99+
      2024-04-02
    • 如何基于Python实现图像的傅里叶变换
      这篇文章主要介绍了如何基于Python实现图像的傅里叶变换,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。前言首先是本文总体代码,改一下图像的读取路径就可以运行了,但我还是建议...
      99+
      2023-06-22
    • 基于Python如何实现帕累托图
      这篇“基于Python如何实现帕累托图”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“基于Python如何实现帕累托图”文章吧...
      99+
      2023-07-05
    • 如何基于Python实现将列表数据生成折线图
      这篇文章主要为大家展示了“如何基于Python实现将列表数据生成折线图”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“如何基于Python实现将列表数据生成折线图”这篇文章吧。代码下面直接发一下样...
      99+
      2023-06-29
    • 如何使用numpy实现高效的二维码图像处理?
      二维码图像处理是现代生活中常见的一种技术,它可以用于各种场景,如支付、身份验证等。而numpy是Python中常用的科学计算库,它提供了很多方便的方法来进行图像处理。本文将介绍如何使用numpy实现高效的二维码图像处理。 一、导入numpy...
      99+
      2023-09-24
      二维码 bash numpy
    • 如何基于Python实现人像雪景小程序
      这篇文章主要介绍了如何基于Python实现人像雪景小程序,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。正文开始制作雪景图:1)素材环境(仅部分)2)运行环境本文涉及的环境:P...
      99+
      2023-06-22
    • 基于DOM+CSS3如何实现OrgChart组织结构图插件
      这篇文章主要为大家展示了“基于DOM+CSS3如何实现OrgChart组织结构图插件 ”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“基于DOM+CSS3如何实现...
      99+
      2024-04-02
    • Python基于均值漂移算法和分水岭算法实现图像分割
      目录一.基于均值漂移算法的图像分割二.基于分水岭算法的图像分割三.总结一.基于均值漂移算法的图像分割 均值漂移(Mean Shfit)算法是一种通用的聚类算法,最早是1975年Fuk...
      99+
      2023-01-11
      Python均值漂移算法 图像分割 Python 分水岭算法 图像分割 Python图像分割
    • Python如何实现图像的二进制与base64互转
      这篇“Python如何实现图像的二进制与base64互转”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Python如何实现图...
      99+
      2023-06-29
    • 如何基于python实现单目三维重建详解
      目录一、单目三维重建概述二、实现过程(1)相机的标定(2)图像特征提取及匹配(3)三维重建三、结论四、代码总结一、单目三维重建概述 客观世界的物体是三维的,而我们用摄像机获取的图像是...
      99+
      2024-04-02
    • 基于OpenCv与JVM如何实现加载保存图像功能
      今天给大家介绍一下基于OpenCv与JVM如何实现加载保存图像功能。,文章的内容小编觉得不错,现在给大家分享一下,觉得有需要的朋友可以了解一下,希望对大家有所帮助,下面跟着小编的思路一起来阅读吧。加载图片openCv有一个名imread的简...
      99+
      2023-06-26
    • 基于Python如何实现自动抠图小程序
      本篇文章为大家展示了基于Python如何实现自动抠图小程序,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。Python主要用来做什么Python主要应用于:1、Web开发;2、数据科学研究;3、网络爬...
      99+
      2023-06-26
    • 如何基于jQuery插件jqzoom实现的图片放大镜效果
      这篇文章主要介绍如何基于jQuery插件jqzoom实现的图片放大镜效果,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!jqzoom插件实现图片放大镜效果。图1.1jqzoom插件实现...
      99+
      2024-04-02
    • 基于Python如何实现批量缩放图片尺寸
      今天小编给大家分享一下基于Python如何实现批量缩放图片尺寸的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。方法一在 Pil...
      99+
      2023-07-05
    • 基于JS如何实现二维码图片固定在右下角某处并跟随滚动条滚动
      这篇文章将为大家详细讲解有关基于JS如何实现二维码图片固定在右下角某处并跟随滚动条滚动,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。1、准备一张二维码图片,大小、图片自己...
      99+
      2024-04-02
    软考高级职称资格查询
    编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
    • 官方手机版

    • 微信公众号

    • 商务合作