Skip to article frontmatterSkip to article content
Site not loading correctly?

This may be due to an incorrect BASE_URL configuration. See the MyST Documentation for reference.

卷积

定义

一维中的互相关和卷积

连续定义:

一维连续互相关:

f(t)=(gh)(t)=g(τ+t)h(τ)dτf(t) = (g \star h)(t) = \int_{-\infty}^{\infty} g(\tau+t) \overline{h(\tau)} d\tau

信号 gg 与核 hh 的一维连续卷积:

f(t)=(gh)(t)=g(τ)h(tτ)dτf(t) = (g * h)(t) = \int_{-\infty}^{\infty} g(\tau) h(t-\tau) d\tau

离散定义:

一维离散互相关:

f[n]=(gh)[n]=mZg[m+n]h[m]f[n] = (g \star h)[n] = \sum_{m\in\mathbb{Z}} g[m+n] \, \overline{h[m]}

信号 gg 与核 hh 的一维离散卷积:

f[n]=(gh)[n]=mZg[m]h[nm]f[n] = (g * h)[n] = \sum_{m\in\mathbb{Z}} g[m] \, h[n-m]

关系(核翻转):

(gh)[n]=(gh~)[n],h~[n]=h[n].(g \star h)[n] = (g * \tilde{h})[n], \quad \tilde{h}[n] = \overline{h[-n]}.

互相关衡量信号与未翻转模板在移动时的相似性;卷积衡量与翻转并移动后的模板的相似性,这解释了其在线性移不变滤波中的作用。

Figure 1:一维互相关 — 在没有核翻转的情况下,相似性与位移的关系。(PDF: 视频链接)

Figure 2:一维卷积 — 在核翻转后,相似性与位移的关系。(PDF: 视频链接)

Figure 3:一维高斯卷积 — 当核滑动时,每个输出采样邻近输入值的加权平均,从而平滑高频变化。(PDF: 视频链接)

Figure 4:一维方波信号卷积 — 每个位移处的输出等于核与输入重叠区域下的面积,可视化了累积过程。(PDF: 视频链接)

许多图像处理结果来自于一个像素相对于其邻域的修改。 当这种修改在整个图像 gg 中是相似的, 它可以用第二幅图像 hh 来数学定义,该图像定义了邻域关系。 这会产生第三幅图像 ff。 这就是所谓的卷积 [Jähne 2005, section 4],用 * 表示:

f(x,y)=(gh)(x,y)=mng(xm,yn) h(m,n)f(x,y) = (g*h)(x,y) = \sum_m \sum_n g(x-m,y-n) \ h(m,n)

直观上,卷积将 gg 中的每个像素 (m,n)(m,n) 按照 hh 的模式并与强度 g(m,n)g(m,n) 成比例地“散布”。 Figure 7 给出了一个计算特定像素的例子。

Figure 5:二维卷积 — 每个输出像素是输入邻域的加权和;观察根据核的不同,边缘模糊与细节保留的对比。(PDF: 视频链接)

Figure 6:RGB图像卷积 — 可以按通道应用后合并,或在亮度上操作;注意较大核会产生颜色渗透。(PDF: 视频链接)

计算 f 的像素 (2,2) 的示例。

Figure 7:计算 ff 的像素 (2,2) 的示例。

为简单起见,图像 hh 通常是:

  • 奇数尺寸(3×33\times35×55\times57×77\times7…);

  • 居中的,即坐标为 (0,0)(0,0) 的像素位于图像 hh 的中心。

图像 hh 根据上下文有不同的名称: 滤波器掩模窗口模式结构元素点扩散函数 (PSF)。

为什么卷积核的尺寸通常是奇数?

上面显示了一些卷积的例子。

示例 1
示例 2
示例 3
左图是另外两幅图像的卷积结果。

Figure 8:左图是另外两幅图像的卷积结果。

gg 是一幅仅由四个非零像素组成的图像。 hh 是一个模糊的点。 gghh 的卷积清楚地显示了“散布”效应: 结果 ff 对应于 gg 的四个像素中的每一个, 位置与 gg 上相同, 根据 hh 上显示的模式散布。 注意,两个邻近像素的“散布”会叠加,从而产生一个非常亮的区域。

何时使用哪种?

  • 互相关:模板匹配、对齐、测量相似性与位移。

  • 卷积:线性移不变处理中的滤波和系统响应。

属性

卷积和互相关在空间/时间和频率域中都有几个重要属性。

卷积属性

空间域

  • 交换律:信号的顺序不重要。 gh=hgg*h = h*g

  • 结合律:分步卷积等同于一次卷积。 g(h1h2)=(gh1)h2g * (h_1 * h_2) = (g * h_1) * h_2

  • 分配律:卷积对加法满足分配律。 g(h1+h2)=gh1+gh2g * (h_1 + h_2) = g*h_1 + g*h_2

  • 线性:缩放一个信号会缩放结果。 α(gh)=(αg)h=g(αh)\alpha (g*h) = (\alpha g) * h = g * (\alpha h),其中 α\alpha 是标量。

  • 单位元:卷积的单位元是狄拉克 δ\delta 函数(在原点处值为1,其他地方为0的单个点)。 gδ=gg * \delta = g

频率域(卷积定理)

卷积的傅里叶变换是各个傅里叶变换的逐元素乘积。此属性对于在频率域中进行高效滤波至关重要。

F(gh)=F(g)F(h)\mathcal{F}(g*h) = \mathcal{F}(g) \cdot \mathcal{F}(h)

反之,频率域中的卷积对应于空间域中的乘法:

F(gh)=F(g)F(h)\mathcal{F}(g \cdot h) = \mathcal{F}(g) * \mathcal{F}(h)

互相关属性

空间域

  • 非交换律:信号的顺序很重要。它是共轭对称的: (gh)(x,y)=(hg)(x,y)(g \star h)(x,y) = \overline{(h \star g)(-x,-y)}

  • 与卷积的关系:互相关等同于与翻转核的卷积: gh=gh~g \star h = g * \tilde{h},其中 h~(x,y)=h(x,y)\tilde{h}(x,y) = \overline{h(-x,-y)}

频率域(互相关定理)

互相关的傅里叶变换是第一个信号的傅里叶变换与第二个信号傅里叶变换的复共轭的逐元素乘积。

F(gh)=F(g)F(h)\mathcal{F}(g \star h) = \mathcal{F}(g) \cdot \overline{\mathcal{F}(h)}

这种关系是理解相位差和信号对齐的关键。结果频谱的幅度,称为互谱密度,表示每个频率下相关的强度,而相位表示时间延迟。

边界效应

卷积公式在图像边界上没有定义: 例如,在 Figure 7 中计算 f1,1f_{1,1} 需要 g0,0g_{0,0} 的值,而这是未定义的。

因此,必须对图像外部的像素值做出假设。 Figure 11 显示了一幅图像以及考虑外部像素的一些可能性,而 Figure 12 显示了这些图像与高斯核卷积的结果。

假设图像外部像素的几种方法。
图像由绿色边缘界定。

Figure 11:假设图像外部像素的几种方法。 图像由绿色边缘界定。

使用相同图像的卷积结果。

Figure 12:使用相同图像的卷积结果。

Figure 12 中可以看出,三种卷积基本相同: 只有边界附近的像素可能不同(在此示例中更暗或更亮)。 无论如何,没有完美的选择来设置图像外部的像素,每种选择都会产生一些误差。 此外,最好的做法是在采集图像时确保感兴趣的对象远离边缘。

最后,注意环绕假设会产生_循环卷积_。 这也是傅里叶域中乘法的结果(参见 傅里叶变换)。

可分离卷积

可分离卷积是指卷积核 hh 可以写成沿两个轴定义的两个一维滤波器(比如 h1h_1h2h_2)的卷积。 举个例子:

[αaαbαcβaβbβcγaγbγc]h=[0α00β00γ0]h1[000abc000]h2=[αβγ]h1[abc]h2\underbrace{\begin{bmatrix} \alpha a & \alpha b & \alpha c \\ \beta a & \beta b & \beta c \\ \gamma a & \gamma b & \gamma c \\ \end{bmatrix}}_{h} = \underbrace{\begin{bmatrix} 0 & \alpha & 0 \\ 0 & \beta & 0 \\ 0 & \gamma & 0 \\ \end{bmatrix}}_{h_1} * \underbrace{\begin{bmatrix} 0 & 0 & 0 \\ a & b & c \\ 0 & 0 & 0 \\ \end{bmatrix}}_{h_2} = \underbrace{\begin{bmatrix} \alpha \\ \beta \\ \gamma \\ \end{bmatrix}}_{h_1} * \underbrace{\begin{bmatrix} a & b & c \\ \end{bmatrix}}_{h_2}

因此,图像 gg 与可分离滤波器 hh 的卷积可以通过先计算 ggh1h_1 的卷积,然后计算前一个结果与 h2h_2 的卷积(或反之)来计算:

gh=g(h1h2)=(gh1)h2=(gh2)h1g * h = g * (h_1*h_2) = (g*h_1) * h_2 = (g*h_2) * h_1

卷积的可分离性节省了计算时间,因为计算两个一维卷积所需的操作比计算一个二维卷积要少。

证明

考虑大小为 M×NM \times N 的两幅图像 gghh

  • 一方面,使用二维卷积计算一个像素 需要 MNMN 次乘法和 MN1MN-1 次加法。 因此,计算卷积后的图像需要 (MN+MN1)×MN(MN+MN-1) \times MN 次操作。

  • 另一方面,沿一列的一维卷积的每个元素需要 MM 次乘法和 M1M-1 次加法。 类似地,沿一行的一维卷积的每个元素需要 NN 次乘法和 N1N-1 次加法。 因此,计算卷积后的图像需要 2(M+N1)×MN2(M+N-1) \times MN 次操作。

很容易看出 2(M+N1)×MN<(MN+MN1)×MN2(M+N-1) \times MN < (MN+MN-1) \times MN 次操作, 凸显了可分离性的效率。

PyTorch 示例:一维卷积

一个最小的 nn.Conv1d 示例,说明离散一维卷积。输入为 [1,2,3,4,5,6],核为 [2,2](步长为1,无填充)。视频展示了当核滑动时,每个输出如何等于核与输入窗口的点积。(PDF: 视频链接)

Figure 13:一维卷积计算 — 每个输出是与核的滑动点积。(PDF: 视频链接)

import torch
import torch.nn as nn

torch.manual_seed(0)

# 输入: batch=1, channels=1, length=6
x = torch.tensor([[[1., 2., 3., 4., 5., 6.]]])

# 核: out_channels=1, in_channels=1, kernel_size=2
conv = nn.Conv1d(in_channels=1, out_channels=1, kernel_size=2, bias=False)

# 设置权重为 [2, 2]
with torch.no_grad():
    conv.weight[:] = torch.tensor([[[2., 2.]]])

# 应用卷积 (PyTorch 默认使用互相关)
y = conv(x)

print("输入:", x)
print("核:", conv.weight)
print("输出:", y)
输入: tensor([[[1., 2., 3., 4., 5., 6.]]])
核: Parameter containing:
tensor([[[2., 2.]]], requires_grad=True)
输出: tensor([[[ 6., 10., 14., 18., 22.]]], grad_fn=<ConvolutionBackward0>)