插值公式(常用插值算法的详细说明)
【资料图】
做图像处理的同学要经常使用图像缩放。我们都知道,图像存储的时候,其实就是一个矩阵,所以在对图像进行缩放的时候,就意味着对矩阵进行操作。如果你想放大图像,这里我们需要使用过采样算法来放大矩阵,如果你想缩小图像,我们需要使用欠采样。
如上图,左图为原始图像矩阵,右图为扩展后的图像矩阵,右图中的橙色圆点表示矩阵扩展后插值算法填充的像素值。因此,在本文中,我们主要讨论如何通过插值算法来填充像素值。
相关功能介绍
Opencv提供了调整图像大小的resize函数,该函数提供了几种不同的插值算法,如下图所示。
这里主要介绍最常用的前五种插值算法,后两种插值算法主要用于仿射变换。简历。从src转换到dst时,WARP_FILL_OUTLIERS可能会有异常值。通过这种设置,离群点的像素可以设置为0。简历。WARP_INVERSE_MAP是应用于仿射变换的逆变换,从dst到src。关于仿射变换的更多信息,请参考我上一篇了解仿射变换的文章。
插值算法的比较
我们随机生成一张55的图片,然后用不同的插值算法放大10倍,比较最终图片的效果。
如果发现灰度图像不方便观察,我们可以通过设置plt的cmap参数来控制颜色,imshow matplotlib提供了几种不同类型的颜色映射方法。
cmap的类别
Sequential通常使用单一色调,逐渐增加亮度和颜色,可以用来表达有序的信息。
发散改变两种不同颜色的亮度和饱和度,遇到中间的不饱和色,通常用于绘制关键中间值或数据偏离零的信息。
循环改变两种不同颜色的亮度,在中间相遇并以不饱和颜色开始/结束,并应用于结束周围的信息。
定性用于表示没有关系或排序的信息。
杂项同上
这里为了方便观察不同插值算法的区别,我们可以选择噪声来观察。这里我随机选择了Set1,只需要把上面代码中的cmap改成Set1就可以了。
通过初步观察不同插值算法的效果图,可以发现最近邻插值和区域插值的效果,而线性插值、三次样条插值和Lanczos插值的整体效果看起来差不多,但细节上还是有区别的。接下来,我们将分析这些插值算法。
最近插值(最近插值)
最近邻插值,也称为近端插值,是一种简单的一维或多维多元插值方法空。插值是通过已知和离散数据点在一个范围内寻找新数据点的过程或方法。最近邻插值算法选择离期望数据点最近的点的值,完全不考虑其他相邻点的值,从而生成一个分段常数插值值作为期望数据点的值。
如上图所示,黑色表示要插入的值,它会选择最接近它的P(x+1,y)的值作为它的值。如果四个点的距离都相等,那么最近邻插值将如何选择?
从上图中不难发现,当插入的值等于所有四个点时,会选择距离最近的左上角的值,即
因为图像坐标系的原点位于左上角。
线性插值(线性插值)
这里的线性插值其实指的是双线性插值,也是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点形成的四个对角矩形区域的加权平均值。
三次插值(双三次插值)
三次插值是一种比较复杂的插值算法,是2D 空中最常用的插值算法。与双线性插值相比,图像边缘更加平滑。函数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个方程。
看了上面一段,好像还是不太懂。接下来,我们来看一个例子。双三次插值常用的双三次函数如下图所示。
上式中a可取-0.5,函数图像如下
对于要插值的像素点(x,y)(x,y可以是浮点数),取其附近的44个域点(xi,易),其中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),。关于双三次插值函数的更详细介绍,请参考:论文http://www.ncorr.com/download/publications/key *** icubic.pdf
面积插值(面积插值)
区域插值算法有两种,缩小图像和放大图像的工作原理不同。
缩小图像如果图像的缩小比例是整数倍,调用INTER_LINEAR_EXACT插值算法时,如果图像的宽度和高度的缩小比例都是2,图像的通道数不是2,那么实际上会调用INTER_AREA。调用INTER_LINEAR时,如果图像的宽度和高度的缩小比例为2,实际上会调用INTER_AREA。INTER_AREA实际上是一个箱式过滤器,类似于一个平均过滤器。
放大图像如果放大图像的尺度是整数倍,类似于最近邻插值。如果放大率不是整数倍,将使用线性插值。
Lanczos插值
Lanczos插值是一种模板算法,需要通过计算模板中的权重信息来计算x的对应值。对于一维信息,如果我们输入的点集是X,那么Lanczos对应一个窗口模板窗口,窗口中每个位置的权重计算如下:
通常,A是2或3。当a=2时,该算法适用于图像缩小的插值。当a=3时,该算法适用于图像放大的插值。根据计算出的权重信息,再根据xxx,可以得到相应的加权平均值:
插值算法的耗时比较
对于不同的插值算法,当缩放因子不同时,耗时会有所不同,如下表所示。
摘要
如果要缩小图像,建议使用INTER_AREA插值,以获得更佳效果。如果想放大图像,INTER_CUBIC效果更好,但是速度慢。你可以考虑使用INTER_LINEAR来获得更快的速度和更好的效果。
关键词: