首页 > 编程知识 正文

像插值算法,像处理卷积运算

时间:2023-05-06 00:12:35 阅读:184933 作者:4288

双三次插值数学原理及其卷积算法原理(Bicubic Interpolation)

本文是维基百科上双三次插值的中文翻译,如有侵权会立即删除。本人刚学图像处理,第一次翻译英文文章,水平有限,如有错误还请指正。

附上原文链接:https://en.wikipedia.org/wiki/Bicubic_interpolation

单位正方形中的插值平面计算:

假设在单位正方形的四个顶点上函数f的函数值、x偏导、y偏导、xy混合偏导都已知。插值曲面p(x,y)可以写为:

通过这4个点f的信息,去确定一个曲面P(x,y)来拟合f,需要确定p(x,y)中的16个参数。
p(x,y)上4个点的函数值满足f:

同上,4个点共8个偏导数满足:

同上,4个点4个混合偏导数满足:

显然,p(x,y)的偏导数可以根据前面设的表达式求导得到:

这样得到的曲面p(x,y)在单位正方形内都连续可导。在任意大小的规则网格上的双三次插值可以通过将上面方法得到的曲面连接起来得到,注意在小方格边界上要满足边界条件。
如果将未知参数按如下顺序列成向量:

并设x为:

则上面p(x,y)中的参数可以由矩阵运算得到:

其中inv(A)为:

这样可以使得α被很快地求解出来。
同样的,也可以列成另外一种矩阵形式,这样更简洁:

两种方法都能确定p(x,y),其中第二种矩阵阶数小且能用矩阵表示p(x,y),更方便。

扩展到矩形网格:

通常应用程序要求双三次插值使用一个矩形网格上的数据,而不是单位正方形。这种情况下,偏导数的定义为:

其中Δx、Δy是网格中矩形的长或宽。
这样,计算α的实用方法是:
设x:

用前面给出的A求解α:

然后将标准化的插值变量(x,y)代入p(x,y):

公式中的x0、x1、y0、y1是(x,y)的近邻点。

这样就得到了一个矩形内的插值曲面p(x,y)。
注意到上面的方法中需要用道偏导数信息,而对于一个离散的像素灰度数组,只有函数值信息,因此需要用下面介绍的方法计算。

从函数值中得到导数:

如果矩形顶点导数未知,那么可以通过矩形顶点的近邻点的函数值的有限次差分来近似得到。
为了计算两个一阶偏导数(x、y两个方向),可以计算该点在对应方向上的两个近邻点的连线的斜率。例如计算x方向的偏导数,可以找到它左边和右边的两个近邻点,然后将这两点相连,得到直线的斜率,作为偏导数。
同样的,也可以计算二阶混合偏导数。例如计算某个矩形顶点的二阶混合偏导数,则先计算它上下两个近邻点的一阶x方向偏导数,再用这两个偏导数值类似前面求y方向偏导数的方法求二阶偏导数。这个计算中,对一个顶点,用到了它八邻域的4个角点的函数值。
对于数据的边界,如果没有部分近邻点,那么这些点可以通过很多方法来近似。一种简单常用的方法是认为边界处的斜率不变,也就是利用已知数据在边界处的斜率以及边界点的函数值来估算不存在的近邻点。

双三次插值的卷积算法:

上面的方法需要在每一个矩形格求解线性方程。
有另一种插值方法可以完成类似的功能。通过在两个维度上与下面的核函数进行卷积,可以得到待插值:

其中a通常设置为-0.5或-0.75。注意W(0)=1,当n为正整数时,W(n)=0(如n=1)。
这个方法是由Keys提出的,他证明了a=-0.5时关于原始函数的取样间隔是三阶收敛的。
如果我们用矩阵来表示通常的a=-0.5的情况,那么我们可以把方程表示一种更友好的方式:

其中,t在0到1之间。注意对于一个维度的立方卷积插值是需要4个取样点的,其中两个在待插值点的左边,另外两个在右边,在这里用-1到2的下标表示了这些点。待插值点与下标为0的点之间的距离就是t。
对于两个维度的插值,则可以现在x方向上进行上面的计算,再在y方向上用x方向上的结果进行第二次上面的计算。

如上面的式子,共16个数据点。先对4个一组的x方向的点用tx进行上面的一维卷积得到b。之后对b用ty进行一维卷积得到p(x,y)。
通过上面的计算,可以得到二维卷积的公式。对于每个取样点,以W(x)*W(y)作为权值,然后对16个取样点加权求和,结果与两次一维卷积的结果相同。

英文原文:https://en.wikipedia.org/wiki/Bicubic_interpolation

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。