MINIBLOG

Blog Note Tags Links About
Home Search
Mar 18, 2026
miniyuan

边缘检测


Images as Functions

把图像视为离散的二维函数 f(x, y),值域可以是单通道(灰度值)或者多通道(RGB)。后续可以对其应用滤波(filtering)、微分(derivative)、傅里叶分析等工具,理解纹理、边缘与频谱特性。

注:可以通过差分近似(finite difference)解决求导问题。数值上常用中心差分。


Filters and Convolution

以下只考虑线性、时不变的系统/滤波器,也即:

  1. 线性性:
    • 齐次性:输入 a⋅x(t)a \cdot x(t)a⋅x(t) →\to→ 输出 a⋅y(t)a \cdot y(t)a⋅y(t)
    • 可加性:输入 x1(t)+x2(t)x_1(t) + x_2(t)x1​(t)+x2​(t) →\to→ 输出 y1(t)+y2(t)y_1(t) + y_2(t)y1​(t)+y2​(t)
  2. 时不变性: 输入 x(t−τ)x(t - \tau)x(t−τ) →\to→ 输出 y(t−τ)y(t - \tau)y(t−τ)

1D Filter: Moving Average

移动平均就是选取一定的窗口大小,每个输出点是窗口中像素值的加权和。 用卷积表示即:

h[n]=(f∗g)[n]=∑k=−KKf[n−k]⋅g[k]h[n] = (f * g)[n] = \sum_{k=-K}^{K} f[n-k] \cdot g[k]h[n]=(f∗g)[n]=k=−K∑K​f[n−k]⋅g[k]

其中 g[k]g[k]g[k] 是滤波器权重。

例如窗口大小 3 的均匀移动平均:

g=[1/3,1/3,1/3]g = [1/3, 1/3, 1/3]g=[1/3,1/3,1/3]

原信号:

f=[2,4,6,8,10,12]f = [2, 4, 6, 8, 10, 12]f=[2,4,6,8,10,12]

则 h[2]=(4+6+8)/3=6h[2] = (4+6+8)/3 = 6h[2]=(4+6+8)/3=6

Convolution and Flourier Transformer

Discrete Signal:

离散卷积:

(f∗g)[n]=∑m=−∞∞f[m] g[n−m](f * g)[n] = \sum_{m=-\infty}^{\infty} f[m]\, g[n-m](f∗g)[n]=m=−∞∑∞​f[m]g[n−m]

离散傅里叶变换:

F{f}(ω)=∑n=−∞∞f[n] e−i2πωn\mathcal{F}\{f\}(\omega) = \sum_{n=-\infty}^{\infty} f[n]\, e^{-i2\pi\omega n}F{f}(ω)=n=−∞∑∞​f[n]e−i2πωn

Continuous Signal:

连续卷积:

(f∗g)(x)=∫−∞∞f(t) g(x−t) dt(f * g)(x) = \int_{-\infty}^{\infty} f(t)\, g(x - t)\, dt(f∗g)(x)=∫−∞∞​f(t)g(x−t)dt

连续傅里叶变换:

F{f}(ω)=∫−∞∞f(t) e−i2πωt dt\mathcal{F}\{f\}(\omega) = \int_{-\infty}^\infty f(t)\, e^{-i2\pi \omega t}\, dtF{f}(ω)=∫−∞∞​f(t)e−i2πωtdt

Convolution Theory:

F{f∗g}=F{f}⋅F{g}\mathcal{F}\{f * g\} = \mathcal{F}\{f\} \cdot \mathcal{F}\{g\}F{f∗g}=F{f}⋅F{g}

也即时域卷积等于频域相乘。本质上是傅里叶变换将输入信号分解为无数单一的基信号,而线性时不变滤波器对基信号只有频率响应,故在频域只需做独立乘法。

我们之间采用的均匀移动平均在频域中实际上集中在低频,故其为低通滤波器,也即 f∗gf * gf∗g 会抑制高频成分,比如噪声。实际上设计时可以先在频域中绘制滤波图形,然后再逆变换到时域得到 filter.

2D Filter: Moving Average

选取一定的窗口大小,每个输出点是窗口中像素的加权和。 卷积表示:

(f∗g)[m,n]=∑k∑ℓf[k,ℓ] g[m−k, n−ℓ](f * g)[m,n] = \sum_{k}\sum_{\ell} f[k,\ell]\, g[m-k,\, n-\ell](f∗g)[m,n]=k∑​ℓ∑​f[k,ℓ]g[m−k,n−ℓ]

Gaussian Filter

高斯滤波是一种常用的低通滤波器。

1D

时域:

g(x)=12π σexp⁡(−x22σ2)g(x) = \frac{1}{\sqrt{2\pi}\,\sigma} \exp\left(-\frac{x^2}{2\sigma^2}\right)g(x)=2π​σ1​exp(−2σ2x2​)

频域:

F{g}(ω)=exp⁡(−σ2ω22)\mathcal{F}\{g\}(\omega) = \exp\left(-\frac{\sigma^2 \omega^2}{2}\right)F{g}(ω)=exp(−2σ2ω2​)

傅里叶变换对:

F{g}(ω)=∫−∞∞g(x)e−iωxdx\mathcal{F}\{g\}(\omega) = \int_{-\infty}^{\infty} g(x) e^{-i\omega x} dxF{g}(ω)=∫−∞∞​g(x)e−iωxdx

2D

空域:

g(x,y)=12πσ2exp⁡(−x2+y22σ2)g(x,y) = \frac{1}{2\pi\sigma^2} \exp\left(-\frac{x^2 + y^2}{2\sigma^2}\right)g(x,y)=2πσ21​exp(−2σ2x2+y2​)

频域:

F{g}(ωx,ωy)=exp⁡(−σ2(ωx2+ωy2)2)\mathcal{F}\{g\}(\omega_x, \omega_y) = \exp\left(-\frac{\sigma^2 (\omega_x^2 + \omega_y^2)}{2}\right)F{g}(ωx​,ωy​)=exp(−2σ2(ωx2​+ωy2​)​)

傅里叶变换对:

F{g}(ωx,ωy)=∬−∞∞g(x,y)e−i(ωxx+ωyy)dxdy\mathcal{F}\{g\}(\omega_x, \omega_y) = \iint_{-\infty}^{\infty} g(x,y) e^{-i(\omega_x x + \omega_y y)} dx dyF{g}(ωx​,ωy​)=∬−∞∞​g(x,y)e−i(ωx​x+ωy​y)dxdy

Parameter

显然在频域仍为 Gaussian 分布。故 σ\sigmaσ 越大,频域越锋利,对选择的低频成分越多。


Edge Detection

Causes of Edges

边缘的判断标准:

  • 深度(Depth)不连续
  • 表面颜色(Surface color)不连续
  • 表面朝向(Surface orientation)不连续
  • 光照(Illumination)不连续

The Definition of Edges

边缘是图像中在某一方向上像素值显著变化,在其正交方向上变化较小的区域。

边缘的数学定义由梯度给出:边缘上,梯度的幅值应当在梯度方向上取得局部极大值,且在梯度的正交方向上基本不变。

梯度向量:

∇f(x,y)=(∂f∂x,∂f∂y)\nabla f(x,y) = \left(\frac{\partial f}{\partial x}, \frac{\partial f}{\partial y}\right)∇f(x,y)=(∂x∂f​,∂y∂f​)

梯度幅值(magnitude):

∣∇f∣=(∂f∂x)2+(∂f∂y)2|\nabla f| = \sqrt{\left(\frac{\partial f}{\partial x}\right)^2 + \left(\frac{\partial f}{\partial y}\right)^2}∣∇f∣=(∂x∂f​)2+(∂y∂f​)2​

梯度方向(orientation):

θ=atan2⁡(∂f∂y,∂f∂x)\theta = \operatorname{atan2} \left(\frac{\partial f}{\partial y}, \frac{\partial f}{\partial x}\right)θ=atan2(∂y∂f​,∂x∂f​)

Criteria for Edge Detection

边缘检测本质上是一个二分类问题,因此可以用以下指标评价:

缩写全称含义
TPTrue Positives正确检测为边缘的边缘像素
FPFalse Positives错误检测为边缘的非边缘像素
FNFalse Negatives错误检测为非边缘的边缘像素
TNTrue Negatives正确检测为非边缘的非边缘像素

由此定义两个核心指标:

精确率:

Precision=TPTP+FP\text{Precision} = \frac{TP}{TP + FP}Precision=TP+FPTP​

也即检测出的边缘中,有多少是真正的边缘

召回率:

Recall=TPTP+FN\text{Recall} = \frac{TP}{TP + FN}Recall=TP+FNTP​

也即真实边缘中,有多少被成功检测出来

三个重要准则:

  1. Good Detection: 尽可能检测出所有真实边缘,尽量避免把噪声检测为边缘。也即精确率和召回率尽量高
  2. Good Localization: 检测到的边缘位置必须尽可能接近真实的边缘位置。也即检测边缘与真实边缘之间的距离尽量小
  3. Single Response: 对于每一条真实的边缘,算法应该只产生一个响应,而不是多个。

Finite Difference Approximation

连续偏导数在数字图像上用差分近似:

  • 中心差分(2阶准确): ∂f∂x∣(m,n)≈f(m+1,n)−f(m−1,n)2\frac{\partial f}{\partial x}\bigg|_{(m,n)} \approx \frac{f(m+1, n) - f(m-1,n)}{2}∂x∂f​​(m,n)​≈2f(m+1,n)−f(m−1,n)​ ∂f∂y∣(m,n)≈f(m,n+1)−f(m,n−1)2\frac{\partial f}{\partial y}\bigg|_{(m,n)} \approx \frac{f(m, n+1) - f(m,n-1)}{2}∂y∂f​​(m,n)​≈2f(m,n+1)−f(m,n−1)​
  • 前向/后向差分也可用,但精度稍差: ∂f∂x∣(m,n)≈f(m+1,n)−f(m,n)\frac{\partial f}{\partial x}\bigg|_{(m,n)} \approx f(m+1,n) - f(m,n)∂x∂f​​(m,n)​≈f(m+1,n)−f(m,n)

注: 在实践中常先平滑再差分,避免对噪声产生大梯度响应。但是也会涉及到平滑-定位权衡(smoothing vs localization)问题。

Derivative Theorem of Convolution

在先平滑后差分时,我们可以利用导数定理进行分步简化计算。

导数定理:

∂∂x(f∗g)=f∗∂g∂x\frac{\partial}{\partial x}(f * g) = f * \frac{\partial g}{\partial x}∂x∂​(f∗g)=f∗∂x∂g​

这意味着我们可以把先卷积再差分合并成一次卷积(用导数的 Gaussian kernel),节省计算并更好地控制尺度。

具体地,我们用 x、y 导数 Gaussian 对图像做卷积得到两个分量:

Gx=f∗∂g∂x,Gy=f∗∂g∂yG_x = f * \frac{\partial g}{\partial x}, \qquad G_y = f * \frac{\partial g}{\partial y}Gx​=f∗∂x∂g​,Gy​=f∗∂y∂g​

从而计算出梯度幅值与方向:

∣∇f∣=Gx2+Gy2,θ=atan2⁡(Gy,Gx)|\nabla f| = \sqrt{G_x^2 + G_y^2}, \quad \theta = \operatorname{atan2} (G_y, G_x)∣∇f∣=Gx2​+Gy2​​,θ=atan2(Gy​,Gx​)

Post Processing

实际上前一步结束时我们就已经完成了梯度的计算。接下来需要进一步解决两个问题即可完成边缘检测:一是边缘的 localization/single response,也即边缘最好是单像素的;二是边缘的 continuity,也即边缘最好是连续的。

Non-Maximal Suppression

非极大值抑制(NMS)算法,用以形成单像素边缘。

步骤:

  1. 对每个像素 qqq 计算梯度 g(q)g(q)g(q) 以及梯度幅值 M(q)M(q)M(q)。
  2. 沿梯度方向向两侧移动到点 q1=q+gdir(q)q_1 = q + g_{dir}(q)q1​=q+gdir​(q),q2=q−gdir(q)q_2 = q - g_{dir}(q)q2​=q−gdir​(q),其中 gdirg_{dir}gdir​ 是归一化梯度向量。
  3. 使用双线性插值在 q1q_1q1​、q2q_2q2​ 处计算幅值 M(q1)M(q_1)M(q1​)、M(q2)M(q_2)M(q2​)。
  4. 若 M(q)M(q)M(q) 大于 M(q1)M(q_1)M(q1​) 和 M(q2)M(q_2)M(q2​),则保留;否则抑制为 0。

双线性插值(bilinear interpolation):

给定四个格点 Q11=(x1,y1)Q_{11}=(x1, y1)Q11​=(x1,y1),Q12=(x1,y2)Q_{12}=(x1, y2)Q12​=(x1,y2),Q21=(x2,y1)Q_{21}=(x2, y1)Q21​=(x2,y1),Q22=(x2,y2)Q_{22}=(x2, y2)Q22​=(x2,y2),P=(x,y)P=(x, y)P=(x,y) 点的双线性插值为:

f(P)=f(Q11)(1−α)(1−β)+f(Q21)α(1−β)+f(Q12)(1−α)β+f(Q22)αβf(P) = f(Q_{11}) (1-\alpha)(1-\beta) + f(Q_{21}) \alpha (1-\beta) + f(Q_{12}) (1-\alpha)\beta + f(Q_{22}) \alpha \betaf(P)=f(Q11​)(1−α)(1−β)+f(Q21​)α(1−β)+f(Q12​)(1−α)β+f(Q22​)αβ

其中 α=x−x1x2−x1\alpha = \frac{x - x_1}{x_2 - x_1}α=x2​−x1​x−x1​​,β=y−y1y2−y1\beta = \frac{y - y_1}{y_2 - y_1}β=y2​−y1​y−y1​​.

本质上就是按照距离整点的距离比例进行加权。

图1:双线性插值
图1:双线性插值

简化 NMS:

离散化为 8 个方向并直接比较相邻像素。

Hysteresis Thresholding

滞后阈值算法,用以形成连续边缘,可以强化边缘并抑制噪声。

首先确定两个阈值:maxValmaxValmaxVal,minValminValminVal. 可按通过 NMS 的像素平均幅值设定:

maxVal=0.3×averageminVal=0.1×averagemaxVal = 0.3 × average \\ minVal = 0.1 × averagemaxVal=0.3×averageminVal=0.1×average

对于像素点 qqq,幅值 M(q)M(q)M(q):

  • 若 M(q)≥maxValM(q) \ge maxValM(q)≥maxVal:强边缘,保留并允许连接。
  • 若 M(q)<maxValM(q) \lt maxValM(q)<maxVal:非边缘,抛弃。
  • 若 minVal≤M(q)<maxValminVal \le M(q) \lt maxValminVal≤M(q)<maxVal:弱边缘,仅在与强边缘连通时保留。

边缘增长(Edge Linking)步骤:

  1. 遍历图像,遇到强边缘开始增长;
  2. 对当前边缘像素,检查在边缘方向(垂直梯度方向)上的两个相邻像素,若任一像素方向与该像素 bin 相同、幅值足够、通过 NMS 判定,则将其也标记为边缘,并继续增长;
  3. 循环直到不能继续增长为止。

Canny Edge Detector

上述流程即使标准的 Canny 算法:

  1. 用导数 Gaussian 计算梯度分量 GxG_xGx​、GyG_yGy​。
  2. 计算梯度幅值和方向。
  3. 非极大值抑制(NMS)将响应细化到单像素宽。
  4. 使用滞后阈值并做边缘连接(Hysteresis + Edge Linking)产生最终的边缘线条。

注:

  • Canny 算法涉及很多 Hyper Parameter,如 σ\sigmaσ、maxValmaxValmaxVal、minValminValminVal. 其中尺度选择(σ\sigmaσ)是关键。σ\sigmaσ 大时噪声更少但定位差;σ\sigmaσ 小时定位好但对噪声敏感。通常对同一图像做多尺度检测以获得更稳健结果。
  • 对颜色图像通常先将颜色图像转换为灰度。也可以使用基于颜色梯度的扩展方法(多通道合并或向量梯度)。
目录
  • Images as Functions
  • Filters and Convolution
    • 1D Filter: Moving Average
    • Convolution and Flourier Transformer
    • 2D Filter: Moving Average
    • Gaussian Filter
      • 1D
      • 2D
      • Parameter
  • Edge Detection
    • Causes of Edges
    • The Definition of Edges
    • Criteria for Edge Detection
    • Finite Difference Approximation
    • Derivative Theorem of Convolution
    • Post Processing
      • Non-Maximal Suppression
      • Hysteresis Thresholding
    • Canny Edge Detector
© 2026 miniyuan. All rights reserved.
Go to miniyuan's GitHub repo