Convolution

Convolution

推荐剧集《民王》📺


Convolution

定义:卷积操作即接受两个函数,并将它们组合起来生成一个新函数。\(a与b\) 的卷积记为\(a \star b\)。

卷积 \(a \star b\) 的理解视角:

  1. 带权的moving average:第一种视角即卷积后的函数每个位置的值是通过计算\(a\)函数一定范围内以\(b\)为权值的加权平均;

  2. Sum of Shifted Filters:第二种视角则是把\(b\)在\(a\)的每个有效取值处复制一份,并且该复制整体乘以该处位置\(a\)函数的取值,最终卷积的结果则是这些所有用a加权后b的复制的叠加。

卷积的性质:

补充:函数和identity filter进行卷积等于函数本身。

通过利用上面的性质,有时可以提升计算效率。

离散卷积
公式
$$(a \star b)[i]= \sum_{j=i-r}^{i+r} a[j]b[i - j]$$

identity filter:\(d[i] = . . . , 0, 0, 1, 0, 0, . . .\)

连续卷积
公式
$$(f*g)(x)= \int _ {-\infty }^ {+\infty } f(t)g(x-t)dt$$

identity filter

离散-连续卷积
公式
$$(a \star f)(x) = \sum_{i= \left \lceil x-r \right \rceil}^{\left \lfloor x+r \right \rfloor} a[i]f(x - i)$$

注意这里和离散卷积不一样,这里filter的取值范围为 \(|x - i| < r\)。

二维卷积

可以用与一维情况相同的方式来解释:每个输出样本都是输入区域的加权平均值,使用2D滤波器(filter)作为“掩码”来确定每个样本在平均值中的权重。


Convolution Filters

下面的每个过滤器都有一个自然半径(natural radius)(除了Gaussian filter),当样本间隔为一个单位时,该半径是用于采样或重建的默认大小。

一些应用场景需要不同大小的过滤器,可以通过缩放基本过滤器来获得:
$$
f_s(x) = \frac{f(x/s)}{s}
$$
一个自然半径为r的过滤器,在尺度s下使用则半径为sr。

一些Convolution Filters

Box Filter的自然半径是 0.5,Tent Filter是 1 ,Gaussian Filter没有自然半径,B-Spline Cubic Filter是 2。

Properties of Filters

  1. 当连续filters用于从离散序列重建连续函数时,如果所得到的函数与采样点处的样本值完全相同,则该连续过滤器是interpolating。也就是说如果filters \(f\) 是interpolating,那么\(f(0) = 1 , 在所有非0的整数下标 i 处,f(i) = 0\)。

  2. 有负值的filters在过滤或者重建信号剧烈不连续位置时会产生overshoot:即在被过滤函数值的急剧变化周围产生额外的值振荡:

    如上图所示是Catmull-Rom filter过滤step function后产生的结果。

  3. 当用作重建滤波器时,如果连续滤波器将常数序列重构为常数函数,则该连续滤波器是ripple free。上面介绍的filters中,除了高斯滤波外,其余的滤波在其自然半径的情况下都是ripple free。

    *补充*:消除离散-连续卷积的ripple: $$ (\overline{a \star f})(x) = \frac{\sum_i a[i]f(x-i)}{\sum_i a[i]} $$
  4. 滤波器的连续程度:即不同的滤波器有着 \(不连续, C^0 连续,C^1 连续,C^2 连续\) 等连续程度,值得注意的是重建出来的函数继承了滤波器的连续性。

Separable Filters

通常任意的2D函数可以成为一个2D filter,但是大多数情况下,可以从1D filters来构建合适的2D filter,separable filter就是这样的一种方法:
$$
f_2(x,y) = f_1(x)f_1(y)
$$

$$
b_2[i,j] = b_1[i]b_1[j]
$$
例如2D的tent filter,Gaussian filter等就是这么构造的。
separable filter的主要优势在于其实现的效率,对于如下的离散卷积:
$$
(a \star b_2)[i,j] = \sum_{i’}\sum_{j’}a[i’,j’]b_1[i-i’]b_1[j-j’]
$$
可以先计算所有要用到的\(S[i’]\),然后将结果存下来,这样就不用多次反复的计算相同的\(S[i’]\):
$$
S[i’]=\sum_{j’}a[i’,j’]b_1[j-j’]
$$
再计算离散卷积:
$$
(a \star b_2)[i,j] = \sum_{i’}b_1[i-i’]S[i’]
$$
这样可以把计算复杂度重\(O(r^2)\)减少到\(O(r)\)。

两个Separable Filters例子

  • separable tent filter:其沿着坐标轴的轮廓是tent function,而沿着对角线的方向是二次曲线。
  • 2D Gaussian filter:和把1D Gaussian绕着原点旋转一周得到的函数相同。沿着各个方向的轮廓都是1D Gaussian。

  • 参考资料《Fundamentals of Computer Graphics 4th Edition》

评论