百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 热门文章 > 正文

一文搞懂常用的插值算法(插值法公式是什么)

bigegpt 2024-08-02 10:52 7 浏览

导读

做图像处理的同学应该经常都会用到图像的缩放,我们都知道图片存储的时候其实就是一个矩阵,所以在对图像进行缩放操作的时候,也就是在对矩阵进行操作,如果想要将图片放大,这里我们就需要用到过采样算法来扩大矩阵,如果想要缩小图片就使用欠采样

如上图所示,左图是原图像矩阵,右图是扩大后的图像矩阵,右图中的橙色点表示的是矩阵扩大之后通过插值算法填充的像素值。所以,这篇文章我们主要探讨的就是如何来通过插值算法来填充像素值

相关函数介绍

在opencv中提供了一个resize函数用来调整图像的大小,里面提供了好几种不同的插值算法,如下图所示

这里我们主要介绍最常用的前5中插值算法,最后两种插值算法主要是应用在仿射变换,cv.WARP_FILL_OUTLIERS在从srcdst变换的时候可能会出现异常值,通过这个设定可以将异常值的像素置0。而cv.WARP_INVERSE_MAP是应用在仿射变换的逆变换,从dstsrc的变换,关于仿射变换的更多资料可以参考我的上篇文章一文搞懂仿射变换

插值算法效果对比


我们通过随机生成一个5×5的图片,然后通过不同的插值算法将其放大10倍之后,来对比最终图片的效果。

如果大家觉得灰度图不方便观察,我们可以通过设置plt.imshowcmap参数来控制颜色,matplotlib提供了几种不同的类别的色彩映射方式

cmap的类别

  • Sequential
    通常使用单一的色调逐渐增加亮度和颜色,可以用来表示有序的信息
  • Diverging
    通过改变两种不同的颜色的亮度和饱和度,在中间以不饱和的颜色相遇,通常来用绘制具有关键的中间值或者数据偏离零的信息

  • Cyclic
    改变两种不同颜色的亮度,在中间和开始/结束以不饱和的颜色相遇,应用于在端点出环绕的信息。
  • Qualitative
    用于表示没有关系排序的信息
  • Miscellaneous
    同上
  • 这里我们为了方便观察不同插值算法之间的区别,我们可以选用杂色来来观察,这里我就随机选用了Set1,只需要将上面代码中的cmap改成了Set1即可

    通过初步观察不同插值算法后的效果图片我们可以发现,最近邻插值区域插值算法的效果,而线性插值三次样条插值Lanczos插值整体效果看起来差不多,不过细节部分还是有所差别,接下来我们就从这几种插值算法来分析一下。

    最近邻插值(Nearest Interpolation)

    最近邻插值也称近端插值,是一种在一维或多维空间上进行多变元插值的简单方法。插值是一种通过已知的、离散的数据点,在范围内推求新数据点的过程或方法。最近邻插值算法选择距离所求数据点最近点的值,并且根本不考虑其他相邻点的值,从而产生一个分段常数的内插值来作为所求数据点的值。

    如上图所示,黑色的×表示需要插入的值,它会选择距离它最近的P(x+1,y)的值来作为它的值。
    如果距离四个点的距离都相等,最近邻插值会如何选择?

    通过上图不难发现,当插入的值距离四个点都相等时,会选择距离最近的左上角的值,这是

    因为图像坐标系的原点位于左上角。

    线性插值(Linear interpolation)

    这里的线性插值其实是指双线性插值,这种插值算法也是resize函数中默认使用的插值算法
    双线性插值,也被称为双线性内插。双线插值是对线性插值在二维坐标系上的扩展,用于对双变量函数进行插值,其核心思想是在两个方向上分别进行一次线性插值。为了帮助大家更好的理解双线性插值算法,我们先来看线性插值
    假设我们已知坐标(x0,y0)与(x1,y1),我们想要得到该区间[x0,x1上任意位置x所对应y的值,如下图所示

    我们可以求出直线的方程,然后将x坐标代入到方程就可以求出对应的y值,通过直线方程的两点式可以得到

    然后我们根据已知的x,将其代入上式可得

    在了解线性插值以后,我们再来看看双线性插值
    假如我们想得到未知函数fff在点P=(x,y)的值,假设我们已知函数f在Q11=(x1,y1),Q12=(x1,y2),Q21=(x2,y1)及Q22=(x2,y2)四个点的值

    首先在x方向进行线性插值,利用Q11?和Q21?可以求得R1的y值,利用Q12?和Q22?可以求得R2的y值


    细心的同学也许发现了,这个插值好像与线性插值并不是一模一样的,所以我们用的是≈而非=,这里其实采用的是一种加权平均算法结合两点来计算其中一点的y值,主要是根据计算点距离两个端点在x方向上的距离来计算计算点y值所占的比例。

    接下来,我们再利用已经计算出来的R1和R2?来P点的插值,可得

    仔细观察上面的公式不难发现,其实PPP点的值等于周围四个点与P点所构成的四个对角矩形面积的加权平均

    双三次插值(Bicubic interpolation)

    双三次插值是一种更加复杂的插值算法,是二维空间中最常用的插值算法,相对双线性插值的图像边缘更加平滑,函数f在点(x,y)的值可以通过矩形网格中最近的十六个采样点的加权平均得到,这里需要使用两个多项式插值三次函数,每个方向使用一个。
    双三次插值通过以下公式进行计算:

    计算系数aij?的过程依赖于插值数据的特性。如果已知插值函数的导数,常用的方法就是使用四个顶点的高度以及每个顶点的三个导数。一阶导数h′x与h′y表示x与y方向的表面斜率,二阶相互导数h''xy表示同时在x与y方向的斜率。这些值可以通过分别对x与y向量取微分得到。对于网格单元的每个顶点,将局部坐标(0,0)、(1,0)、(0,1)、(1,1)代入这些方程,再解这16个方程。

    看了上面这段话之后,貌似还是不太好理解,接下来我们看一个例子,双三次插值常用的BiCubic函数如下图

    上式中的a取-0.5即可,函数图像如下

    对待插值的像素点(x,y)(x,y可为浮点数),取其附近的4×4领域点(xi,yi)其中i,j=0,1,2,3。按下面的公式进行插值计算:

    例如,我们需要求解P点值,在P点周围有16个点

    首先,我们要求出当前像素与PPP点的距离,比如a00?距离P(x+u,y+v)的距离为(1+u,1+v),那么我们可以得到a00对应的系数为(W(1+u),W(1+v)),所以a11?的系数为(W(u),W(v)),a22的系数为(W(1?u),W(1?v)),a33的系数为W(2?u),W(2?v),同理可以得到剩下点的系数,再根据上面的函数就可以求出P点的值。
    关于双三次插值函数更加详细介绍可以参考:论文http://www.ncorr.com/download/publications/keysbicubic.pdf

    区域插值(Area interpolation)

    区域插值算法主要分两种情况,缩小图像和放大图像的工作原理并不相同。

    • 缩小图像
      如果图像缩小的比例是整数倍,在调用INTER_LINEAR_EXACT插值算法时,如果图像的宽和高的缩小比例都是2,而且图像的通道数不是2,实际上会调用INTER_AREA。在调用INTER_LINEAR时,如果图像的宽和高的缩小比例都是2,实际上是会调用INTER_AREA
      INTER_AREA实际上是个box filter,类似于均值滤波器
    • 放大图像
      如果放大图像的比例是整数倍,与最近邻插值相似。如果放大的比例不是整数倍,则会采用线性插值

    Lanczos插值

    Lanczos插值属于一种模板算法,需要通过计算模板中的权重信息来计算x对应的值。对于一维信息,假如我们输入的点集为X,那么,Lanczos对应有个窗口模板Window,窗口中每个位置的权重计算如下:

    通常a取2或者3,当a=2时,该算法适应于图像缩小的插值。当a=3时,算法适用于图像放大的插值。根据计算出来的权重信息,然后再根据xxx即可求出对应的加权平均:

    插值算法耗时比较

    对于不同的插值算法,在缩放因子不同的时候,耗时会有所区别,具体对照如下表所示

    总结

    如果要缩小图像,推荐使用INTER_AREA插值效果最好,如果要放大图像INTER_CUBIC效果最好,但是速度较慢,可以考虑使用INTER_LINEAR速度较快,效果也还不错。

    参考:
    1.http://www.1zlab.com/wiki/python-opencv-tutorial/opencv-interpolation-algrithm/
    2.https://zh.wikipedia.org/wiki/%E7%BA%BF%E6%80%A7%E6%8F%92%E5%80%BC
    3.https://zh.wikipedia.org/wiki/%E5%8F%8C%E4%B8%89%E6%AC%A1%E6%8F%92%E5%80%BC
    4.https://blog.csdn.net/nandina179/article/details/85330552
    5.https://blog.csdn.net/qq_29058565/article/details/52769497
    6.https://blog.csdn.net/u010555688/article/details/24352343
    7.https://zhuanlan.zhihu.com/p/38493205

    相关推荐

    当Frida来“敲”门(frida是什么)

    0x1渗透测试瓶颈目前,碰到越来越多的大客户都会将核心资产业务集中在统一的APP上,或者对自己比较重要的APP,如自己的主业务,办公APP进行加壳,流量加密,投入了很多精力在移动端的防护上。而现在挖...

    服务端性能测试实战3-性能测试脚本开发

    前言在前面的两篇文章中,我们分别介绍了性能测试的理论知识以及性能测试计划制定,本篇文章将重点介绍性能测试脚本开发。脚本开发将分为两个阶段:阶段一:了解各个接口的入参、出参,使用Python代码模拟前端...

    Springboot整合Apache Ftpserver拓展功能及业务讲解(三)

    今日分享每天分享技术实战干货,技术在于积累和收藏,希望可以帮助到您,同时也希望获得您的支持和关注。架构开源地址:https://gitee.com/msxyspringboot整合Ftpserver参...

    Linux和Windows下:Python Crypto模块安装方式区别

    一、Linux环境下:fromCrypto.SignatureimportPKCS1_v1_5如果导包报错:ImportError:Nomodulenamed'Crypt...

    Python 3 加密简介(python des加密解密)

    Python3的标准库中是没多少用来解决加密的,不过却有用于处理哈希的库。在这里我们会对其进行一个简单的介绍,但重点会放在两个第三方的软件包:PyCrypto和cryptography上,我...

    怎样从零开始编译一个魔兽世界开源服务端Windows

    第二章:编译和安装我是艾西,上期我们讲述到编译一个魔兽世界开源服务端环境准备,那么今天跟大家聊聊怎么编译和安装我们直接进入正题(上一章没有看到的小伙伴可以点我主页查看)编译服务端:在D盘新建一个文件夹...

    附1-Conda部署安装及基本使用(conda安装教程)

    Windows环境安装安装介质下载下载地址:https://www.anaconda.com/products/individual安装Anaconda安装时,选择自定义安装,选择自定义安装路径:配置...

    如何配置全世界最小的 MySQL 服务器

    配置全世界最小的MySQL服务器——如何在一块IntelEdison为控制板上安装一个MySQL服务器。介绍在我最近的一篇博文中,物联网,消息以及MySQL,我展示了如果Partic...

    如何使用Github Action来自动化编译PolarDB-PG数据库

    随着PolarDB在国产数据库领域荣膺桂冠并持续获得广泛认可,越来越多的学生和技术爱好者开始关注并涉足这款由阿里巴巴集团倾力打造且性能卓越的关系型云原生数据库。有很多同学想要上手尝试,却卡在了编译数据...

    面向NDK开发者的Android 7.0变更(ndk android.mk)

    订阅Google官方微信公众号:谷歌开发者。与谷歌一起创造未来!受Android平台其他改进的影响,为了方便加载本机代码,AndroidM和N中的动态链接器对编写整洁且跨平台兼容的本机...

    信创改造--人大金仓(Kingbase)数据库安装、备份恢复的问题纪要

    问题一:在安装KingbaseES时,安装用户对于安装路径需有“读”、“写”、“执行”的权限。在Linux系统中,需要以非root用户执行安装程序,且该用户要有标准的home目录,您可...

    OpenSSH 安全漏洞,修补操作一手掌握

    1.漏洞概述近日,国家信息安全漏洞库(CNNVD)收到关于OpenSSH安全漏洞(CNNVD-202407-017、CVE-2024-6387)情况的报送。攻击者可以利用该漏洞在无需认证的情况下,通...

    Linux:lsof命令详解(linux lsof命令详解)

    介绍欢迎来到这篇博客。在这篇博客中,我们将学习Unix/Linux系统上的lsof命令行工具。命令行工具是您使用CLI(命令行界面)而不是GUI(图形用户界面)运行的程序或工具。lsoflsof代表&...

    幻隐说固态第一期:固态硬盘接口类别

    前排声明所有信息来源于网络收集,如有错误请评论区指出更正。废话不多说,目前固态硬盘接口按速度由慢到快分有这几类:SATA、mSATA、SATAExpress、PCI-E、m.2、u.2。下面我们来...

    新品轰炸 影驰SSD多款产品登Computex

    分享泡泡网SSD固态硬盘频道6月6日台北电脑展作为全球第二、亚洲最大的3C/IT产业链专业展,吸引了众多IT厂商和全球各地媒体的热烈关注,全球存储新势力—影驰,也积极参与其中,为广大玩家朋友带来了...