Convolution is the most important and fundamental concept in signal processing and analysis. By using convolution, we can construct the output of system for any arbitrary input signal, if we know the impulse response of system.

在信号的处理和分析中,卷积操作起着极为重要和根本性的作用。如果我们知道系统的脉冲响应,通过卷积操作,我们可以对任意的输入信号,构造出系统的输出。

1-D卷积

卷积在离散时域中的数学定义为:

x[n]是输入信号,h[n]是响应脉冲,y[n]是输出。公式中的 * 号代表卷积,我们将x[k]项乘以一个时间偏移量h[n-k],并将它们的相乘结果相加。

而理解卷积的前提是需要理解脉冲响应和脉冲分解。

通过结合脉冲响应和脉冲分解的属性性质,我们最终能构造出卷积的等式。在线性和时间不变的系统中,由多个输入单元同时计算得到的结果等价于由这几个单元分别输入计算的结果之和。

总而言之,一个输入信号可以被分解为一组脉冲,而输出信号能够由变化和偏移的响应脉冲组合而成。

2-D 卷积

二维卷积是之前一维卷积的扩展,二维卷积同时对二维的空间域中的x轴方向和y轴方向进行卷积。二维卷积通常被用作图像的处理,例如图像的平滑、锐化和边缘检测等。

二维卷积二维卷积

简单的来讲,卷积就是对两个同等维度的数组进行相乘,得到另一个同等维度的数组。通常,第一个数组如果是二维的图像,那么第二个数组是一个比第一个图像数组要小很多的二维数组,我们一般把它称作 卷积核 (kernel)。下图中的每一个单元格代表图像的像素值或者kernel的值,左图为图像的二维数组,右图为卷积核的二维数组。

image and kernel

卷积操作就是将右图的卷积核在左图中的图像中滑动,从左上角到右下角,一个一个像素的移动,同时保证卷积核完全在图像内而不出界(当然,卷积的操作存在不同的实现方式,这只是其中一种)。卷积核移动的每一次,对应一个数值输出,输出值等于卷积核和对应的图像像素值相乘的积德和。例如,当卷积核从左上角依次移动到右下角时,最后一次输出值的计算为:

如果二位图像数组有M行,N列,卷积核有m行,n列,则通过以上方式实现的卷积运算得到的最终结果是一个二位的数组,大小为M-m+1行,N-n+1列。

以上操作,用数学的表达方式为:

其中,

注意⚠️,以上只是图像卷积实现的一种方式,卷积操作还可以对图像进行padding操作,设定合适的stride,从而可以达到输出结果和原图像尺寸相同大小。

卷积可以实现很多功能,例如可以用作空间的过滤器,特征提取器等。典型的代表有高斯平滑(Gaussian Smoothing),Sobel边缘检测器。

卷积核的不同(包括核的大小、核的值),会产生不同的效果。设计卷积核需要高等的数学知识。当然你也可以从网络上查找到很多现成的卷积核设计。举些例子吧(左图对应卷积核,右图对应图像效果)。

图像锐化

kernel image

图像模糊

kernel image

图像边缘增强

kernel image

图像边缘检测

kernel image

图像浮雕

kernel image


注意事项

卷积核的旋转操作(180度旋转,flip)
为什么要进行这个操作?
进行flip旋转并不意味着有什么好处或者能避免什么灾难性的后果。主要是二维卷积的定义就是这样的。如果你不flip旋转,你就违背了二维卷积的最初的定义。而不flip旋转的卷积有着另外一个名字:关联(correlation)。

那么人们为什么定义二维卷积时要进行flip旋转呢?这起源于一维卷积时为了处理信号响应的一些缺点,需要进行flip旋转操作。所以,人们为了保持二维卷积和一维卷积的一致性,对二维卷积进行了flip旋转操作。