【整理】卷积本质和运算

CMU 的 16720 "Computer Vision" 第二节课“复习”了卷积相关概念,当然对我来说基本是预习:-) 而且因为太累了上课还睡着了一会儿,导致基本没咋听懂。今天看PPT发现上面除了图啥也无,还真有我自己做PPT的风范:-) 于是在知乎上学习了一下卷积的定义、本质和运算方法。

来源: 如何通俗易懂地解释卷积?

有两个回答基本讲清楚了,一个是从“反褶”的角度,角度是输出信号在每个时间点上的信号的计算方法;另一个是从“平移+叠加”的角度,角度是输入信号通过响应的每个时间点后在输出信号上的分量。

平移+叠加

作者:张俊博 链接:https://www.zhihu.com/question/22298352/answer/34267457 来源:知乎 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

不推荐用“反转/翻转/反褶/对称”等解释卷积。好好的信号为什么要翻转?导致学生难以理解卷积的物理意义。这个其实非常简单的概念,国内的大多数教材却没有讲透。直接看图,不信看不懂。以离散信号为例,连续信号同理。已知

已知

下面通过演示求的过程,揭示卷积的物理意义。第一步,乘以并平移到位置0:

第二步,乘以并平移到位置1:

第三步,乘以并平移到位置2:

最后,把上面三个图叠加,就得到了:

简单吧?无非是平移(没有反褶!)、叠加。

从这里,可以看到卷积的重要的物理意义是:一个函数(如:单位响应)在另一个函数(如:输入信号)上的加权叠加。

重复一遍,这就是卷积的意义:加权叠加。对于线性时不变系统,如果知道该系统的单位响应,那么将单位响应和输入信号求卷积,就相当于把输入信号的各个时间点的单位响应 加权叠加,就直接得到了输出信号。

通俗的说:

在输入信号的每个位置,叠加一个单位响应,就得到了输出信号。这正是单位响应是如此重要的原因。

在输入信号的每个位置,叠加一个单位响应,就得到了输出信号。这正是单位响应是如此重要的原因。

在输入信号的每个位置,叠加一个单位响应,就得到了输出信号。这正是单位响应是如此重要的原因。

一个很有价值的评论:楼主这种做法和通常教材上的区别在于:书上先反褶再平移,把输入信号当作一个整体,一次算出一个时间点的响应值;而楼主把信号拆开,一次算出一个信号在所有时间的响应值,再把各个信号相加。两者本质上是相同的。 —— @吃玉米的粥

反褶

作者:palet 链接:https://www.zhihu.com/question/22298352/answer/637156871 来源:知乎 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

对卷积的困惑

卷积这个概念,很早以前就学过,但是一直没有搞懂。教科书上通常会给出定义,给出很多性质,也会用实例和图形进行解释,但究竟为什么要这么设计,这么计算,背后的意义是什么,往往语焉不详。作为一个学物理出身的人,一个公式倘若倘若给不出结合实际的直观的通俗的解释(也就是背后的“物理”意义),就觉得少了点什么,觉得不是真的懂了。

教科书上一般定义函数 \(f,g\) ​的卷积 \(f*g(n)\) ​如下:

连续形式:

\[(f*g)(n)=\int_{-\infty}^{\infty}{f(\tau)g(n-\tau)\mathrm{d}\tau}\]

​​​离散形式:

\[(f*g)(n)=\sum_{\tau = -\infty}^{\infty}{f(\tau)g(n-\tau)}\]

​​并且也解释了,先对g函数进行翻转,相当于在数轴上把g函数从右边褶到左边去,也就是卷积的“卷”的由来。然后再把g函数平移到n,在这个位置对两个函数的对应点相乘,然后相加,这个过程是卷积的“积”的过程。这个只是从计算的方式上对公式进行了解释,从数学上讲无可挑剔,但进一步追问,为什么要先翻转再平移,这么设计有何用意?还是有点费解。

在知乎,已经很多的热心网友对卷积举了很多形象的例子进行了解释,如卷地毯、丢骰子、打耳光、存钱等等。读完觉得非常生动有趣,但过细想想,还是感觉有些地方还是没解释清楚,甚至可能还有瑕疵,或者还可以改进(这些后面我会做一些分析)。带着问题想了两个晚上,终于觉得有些问题想通了,所以就写出来跟网友分享,共同学习提高。不对的地方欢迎评论拍砖。。。

明确一下,这篇文章主要想解释两个问题:1. 卷积这个名词是怎么解释?“卷”是什么意思?“积”又是什么意思?2. 卷积背后的意义是什么,该如何解释?

考虑的应用场景

为了更好地理解这些问题,我们先给出两个典型的应用场景:

  1. 信号分析一个输入信号 \(f(t)\) ,经过一个线性系统(其特征可以用单位冲击响应函数\(g(t)\)描述)以后,输出信号应该是什么?实际上通过卷积运算就可以得到输出信号。
  2. 图像处理输入一幅图像\(f(x,y)\),经过特定设计的卷积核\(g(x,y)\)进行卷积处理以后,输出图像将会得到模糊,边缘强化等各种效果。

对卷积的理解

对卷积这个名词的理解:所谓两个函数的卷积,本质上就是先将一个函数翻转,然后进行滑动叠加。在连续情况下,叠加指的是对两个函数的乘积求积分,在离散情况下就是加权求和,为简单起见就统一称为叠加。

整体看来是这么个过程: 翻转——>滑动——>叠加——>滑动——>叠加——>滑动——>叠加.....

多次滑动得到的一系列叠加值,构成了卷积函数。

卷积的“卷”,指的的函数的翻转,从 \(g(t)\) 变成 \(g(-t)\) 的这个过程;同时,“卷”还有滑动的意味在里面(吸取了网友李文清的建议)。如果把卷积翻译为“褶积”,那么这个“褶”字就只有翻转的含义了。

卷积的“积”,指的是积分/加权求和。有些文章只强调滑动叠加求和,而没有说函数的翻转,我觉得是不全面的;有的文章对“卷”的理解其实是“积”,我觉得是张冠李戴。

对卷积的意义的理解:

  1. 从“积”的过程可以看到,我们得到的叠加值,是个全局的概念。以信号分析为例,卷积的结果是不仅跟当前时刻输入信号的响应值有关,也跟过去所有时刻输入信号的响应都有关系,考虑了对过去的所有输入的效果的累积。在图像处理的中,卷积处理的结果,其实就是把每个像素周边的,甚至是整个图像的像素都考虑进来,对当前像素进行某种加权处理。所以说,“积”是全局概念,或者说是一种“混合”,把两个函数在时间或者空间上进行混合。
  2. 那为什么要进行“卷”?直接相乘不好吗?我的理解,进行“卷”(翻转)的目的其实是施加一种约束,它指定了在“积”的时候以什么为参照。在信号分析的场景,它指定了在哪个特定时间点的前后进行“积”,在空间分析的场景,它指定了在哪个位置的周边进行累积处理。

举例说明

下面举几个例子说明为什么要翻转,以及叠加求和的意义。

例1:信号分析

如下图所示,输入信号是 \(f(t)\) ,是随时间变化的。系统响应函数是 \(g(t)\) ,图中的响应函数是随时间指数下降的,它的物理意义是说:如果在 \(t=0\) 的时刻有一个输入,那么随着时间的流逝,这个输入将不断衰减。换言之,到了 \(t=T\) 时刻,原来在 \(t=0\) 时刻的输入 \(f(0)\) 的值将衰减为\(f(0)g(T)\)

​​考虑到信号是连续输入的,也就是说,每个时刻都有新的信号进来,所以,最终输出的是所有之前输入信号的累积效果。如下图所示,在 \(T=10\) 时刻,输出结果跟图中带标记的区域整体有关。其中,f(10)因为是刚输入的,所以其输出结果应该是 \(f(10)g(0)\),而时刻\(t=9\)的输入\(f(9)\),只经过了1个时间单位的衰减,所以产生的输出应该是 \(f(9)g(1)\),如此类推,即图中虚线所描述的关系。这些对应点相乘然后累加,就是\(T=10\)时刻的输出信号值,这个结果也是\(f\)\(g\)两个函数在\(T=10\)时刻的卷积值。​

​​显然,上面的对应关系看上去比较难看,是拧着的,所以,我们把\(g\)函数对折一下,变成了\(g(-t)\),这样就好看一些了。看到了吗?这就是为什么卷积要“卷”,要翻转的原因,这是从它的物理意义中给出的。​

上图虽然没有拧着,已经顺过来了,但看上去还有点错位,所以再进一步平移\(T\)个单位,就是下图。它就是本文开始给出的卷积定义的一种图形的表述:

所以,在以上计算T时刻的卷积时,要维持的约束就是: \(t+ (T-t) = T\) 。这种约束的意义,大家可以自己体会。

例3:图像处理

还是引用知乎问题 如何通俗易懂地解释卷积?中 马同学的例子。

图像可以表示为矩阵形式(下图摘自马同学的文章):

对图像的处理函数(如平滑,或者边缘提取),也可以用一个\(g\)矩阵来表示,如:

\[g=\left[ \begin{matrix} b_{-1,-1} & b_{-1,0} & b_{-1,1} \\ b_{0,-1} & b_{0,0} & b_{0,1} \\ b_{1,-1} & b_{1,0} & b_{1,1} \end{matrix} \right]\]

注意,我们在处理平面空间的问题,已经是二维函数了,相当于:

\[f(x,y)=a_{x,y}g(x,y)=b_{x,y}\]

那么函数\(f\)\(g\)的在\((u,v)\)处的卷积 \(f*g(u,v)\) 该如何计算呢?​

首先我们在原始图像矩阵中取出\((u,v)\)处的矩阵:

\[f=\left[ \begin{matrix} b_{u-1,v-1} & b_{u-1,v} & b_{u-1,v+1} \\ b_{u,v-1} & b_{u,v} & b_{u,v+1} \\ b_{u+1,v-1} & b_{u+1,v} & b_{u+1,v+1} \end{matrix} \right]\]

然后将图像处理矩阵翻转(这个翻转有点意思,不是延x轴和y轴两个方向翻转,而是沿右上到左下的对角线翻转,这是为了凑后面的内积公式。),如下:

\[g'=\left[ \begin{matrix} b_{1,1} & b_{0,1} & b_{-1,1} \\ b_{1,0} & b_{0,0} & b_{-1,0} \\ b_{1,-1} & b_{0,-1} & b_{-1,-1} \end{matrix} \right]\]

可对比下图:

计算卷积时,就可以用 \(f\)\(g'\) 的内积:

\[f*g(u,v)=a_{u-1,v-1}\times b_{1,1}+a_{u-1,v}\times b_{1,0} +...+ a_{u+1,v+1}\times b_{-1,-1}\]

请注意,以上公式有一个特点,做乘法的两个对应变量a,b的下标之和都是\((u,v)\),其目的是对这种加权求和进行一种约束。这也是为什么要将矩阵g进行翻转的原因。

以上矩阵下标之所以那么写,并且进行了翻转,是为了让大家更清楚地看到跟卷积的关系。这样做的好处是便于推广,也便于理解其物理意义。实际在计算的时候,都是用翻转以后的矩阵,直接求矩阵内积就可以了。

以上计算的是\((u,v)\)处的卷积,延x轴或者y轴滑动,就可以求出图像中各个位置的卷积,其输出结果是处理以后的图像(即经过平滑、边缘提取等各种处理的图像)。

再深入思考一下,在算图像卷积的时候,我们是直接在原始图像矩阵中取了\((u,v)\)处的矩阵,为什么要取这个位置的矩阵,本质上其实是为了满足以上的约束。因为我们要算\((u,v)\)处的卷积,而g矩阵是3x3的矩阵,要满足下标跟这个3x3矩阵的和是\((u,v)\),只能是取原始图像中以\((u,v)\)为中心的这个3x3矩阵,即图中的阴影区域的矩阵。

推而广之,如果如果g矩阵不是3x3,而是5x5,那我们就要在原始图像中取以\((u,v)\)为中心的5x5矩阵进行计算。由此可见,这种卷积就是把原始图像中的相邻像素都考虑进来,进行混合。相邻的区域范围取决于g矩阵的维度,维度越大,涉及的周边像素越多。而矩阵的设计,则决定了这种混合输出的图像跟原始图像比,究竟是模糊了,还是更锐利了。

比如说,如下图像处理矩阵将使得图像变得更为平滑,显得更模糊,因为它联合周边像素进行了平均处理:

\[g=\left[ \begin{matrix} \frac{1}{9} & \frac{1}{9} & \frac{1}{9} \\ \frac{1}{9} & \frac{1}{9} & \frac{1}{9} \\ \frac{1}{9} & \frac{1}{9} & \frac{1}{9} \end{matrix} \right]\]

而如下图像处理矩阵将使得像素值变化明显的地方更为明显,强化边缘,而变化平缓的地方没有影响,达到提取边缘的目的:

\[g=\left[ \begin{matrix} -1 & -1 & -1 \\ -1 & 9 & -1 \\ -1 & -1 & -1 \end{matrix} \right]\]

注:观察到上面两个矩阵,所有元素和为1

另一个评论:层主解释的很好,图像处理中二维矩阵为什么要翻转还是不能完全理解,记得图像处理中好多滤波过程都没有翻转矩阵,而直接定义成相关,而不是卷积,不知道这样定义有何意义。 —— @风云钢炮 回复:图像处理的二维矩阵和的下标之所以那么写,并且进行了翻转,是为了让大家更清楚地看到跟卷积的关系。这样做的好处是便于推广,也便于理解其物理意义。实际在计算的时候,直接求矩阵内积就可以。 这解释了Lucey说的为什么实际上python库中对图像卷积的操作实际上是corr而不是conv,因为其关于副对角线其实是对称的