Images as Functions
把图像视为离散的二维函数 f(x, y),值域可以是单通道(灰度值)或者多通道(RGB)。后续可以对其应用滤波(filtering)、微分(derivative)、傅里叶分析等工具,理解纹理、边缘与频谱特性。
注:可以通过差分近似(finite difference)解决求导问题。数值上常用中心差分。
Filters and Convolution
以下只考虑线性、时不变的系统/滤波器,也即:
- 线性性:
- 齐次性:输入 a⋅x(t) → 输出 a⋅y(t)
- 可加性:输入 x1(t)+x2(t) → 输出 y1(t)+y2(t)
- 时不变性:
输入 x(t−τ) → 输出 y(t−τ)
1D Filter: Moving Average
移动平均就是选取一定的窗口大小,每个输出点是窗口中像素值的加权和。
用卷积表示即:
h[n]=(f∗g)[n]=k=−K∑Kf[n−k]⋅g[k]
其中 g[k] 是滤波器权重。
例如窗口大小 3 的均匀移动平均:
g=[1/3,1/3,1/3]
原信号:
f=[2,4,6,8,10,12]
则 h[2]=(4+6+8)/3=6
Discrete Signal:
离散卷积:
(f∗g)[n]=m=−∞∑∞f[m]g[n−m]
离散傅里叶变换:
F{f}(ω)=n=−∞∑∞f[n]e−i2πωn
Continuous Signal:
连续卷积:
(f∗g)(x)=∫−∞∞f(t)g(x−t)dt
连续傅里叶变换:
F{f}(ω)=∫−∞∞f(t)e−i2πωtdt
Convolution Theory:
F{f∗g}=F{f}⋅F{g}
也即时域卷积等于频域相乘。本质上是傅里叶变换将输入信号分解为无数单一的基信号,而线性时不变滤波器对基信号只有频率响应,故在频域只需做独立乘法。
我们之间采用的均匀移动平均在频域中实际上集中在低频,故其为低通滤波器,也即 f∗g 会抑制高频成分,比如噪声。实际上设计时可以先在频域中绘制滤波图形,然后再逆变换到时域得到 filter.
2D Filter: Moving Average
选取一定的窗口大小,每个输出点是窗口中像素的加权和。
卷积表示:
(f∗g)[m,n]=k∑ℓ∑f[k,ℓ]g[m−k,n−ℓ]
Gaussian Filter
高斯滤波是一种常用的低通滤波器。
1D
时域:
g(x)=2πσ1exp(−2σ2x2)
频域:
F{g}(ω)=exp(−2σ2ω2)
傅里叶变换对:
F{g}(ω)=∫−∞∞g(x)e−iωxdx
2D
空域:
g(x,y)=2πσ21exp(−2σ2x2+y2)
频域:
F{g}(ωx,ωy)=exp(−2σ2(ωx2+ωy2))
傅里叶变换对:
F{g}(ωx,ωy)=∬−∞∞g(x,y)e−i(ωxx+ωyy)dxdy
Parameter
显然在频域仍为 Gaussian 分布。故 σ 越大,频域越锋利,对选择的低频成分越多。
Edge Detection
Causes of Edges
边缘的判断标准:
- 深度(Depth)不连续
- 表面颜色(Surface color)不连续
- 表面朝向(Surface orientation)不连续
- 光照(Illumination)不连续
The Definition of Edges
边缘是图像中在某一方向上像素值显著变化,在其正交方向上变化较小的区域。
边缘的数学定义由梯度给出:边缘上,梯度的幅值应当在梯度方向上取得局部极大值,且在梯度的正交方向上基本不变。
梯度向量:
∇f(x,y)=(∂x∂f,∂y∂f)
梯度幅值(magnitude):
∣∇f∣=(∂x∂f)2+(∂y∂f)2
梯度方向(orientation):
θ=atan2(∂y∂f,∂x∂f)
Criteria for Edge Detection
边缘检测本质上是一个二分类问题,因此可以用以下指标评价:
| 缩写 | 全称 | 含义 |
|---|
| TP | True Positives | 正确检测为边缘的边缘像素 |
| FP | False Positives | 错误检测为边缘的非边缘像素 |
| FN | False Negatives | 错误检测为非边缘的边缘像素 |
| TN | True Negatives | 正确检测为非边缘的非边缘像素 |
由此定义两个核心指标:
精确率:
Precision=TP+FPTP
也即检测出的边缘中,有多少是真正的边缘
召回率:
Recall=TP+FNTP
也即真实边缘中,有多少被成功检测出来
三个重要准则:
- Good Detection:
尽可能检测出所有真实边缘,尽量避免把噪声检测为边缘。也即精确率和召回率尽量高
- Good Localization:
检测到的边缘位置必须尽可能接近真实的边缘位置。也即检测边缘与真实边缘之间的距离尽量小
- Single Response:
对于每一条真实的边缘,算法应该只产生一个响应,而不是多个。
Finite Difference Approximation
连续偏导数在数字图像上用差分近似:
- 中心差分(2阶准确):
∂x∂f(m,n)≈2f(m+1,n)−f(m−1,n)
∂y∂f(m,n)≈2f(m,n+1)−f(m,n−1)
- 前向/后向差分也可用,但精度稍差:
∂x∂f(m,n)≈f(m+1,n)−f(m,n)
注:
在实践中常先平滑再差分,避免对噪声产生大梯度响应。但是也会涉及到平滑-定位权衡(smoothing vs localization)问题。
Derivative Theorem of Convolution
在先平滑后差分时,我们可以利用导数定理进行分步简化计算。
导数定理:
∂x∂(f∗g)=f∗∂x∂g
这意味着我们可以把先卷积再差分合并成一次卷积(用导数的 Gaussian kernel),节省计算并更好地控制尺度。
具体地,我们用 x、y 导数 Gaussian 对图像做卷积得到两个分量:
Gx=f∗∂x∂g,Gy=f∗∂y∂g
从而计算出梯度幅值与方向:
∣∇f∣=Gx2+Gy2,θ=atan2(Gy,Gx)
Post Processing
实际上前一步结束时我们就已经完成了梯度的计算。接下来需要进一步解决两个问题即可完成边缘检测:一是边缘的 localization/single response,也即边缘最好是单像素的;二是边缘的 continuity,也即边缘最好是连续的。
Non-Maximal Suppression
非极大值抑制(NMS)算法,用以形成单像素边缘。
步骤:
- 对每个像素 q 计算梯度 g(q) 以及梯度幅值 M(q)。
- 沿梯度方向向两侧移动到点 q1=q+gdir(q),q2=q−gdir(q),其中 gdir 是归一化梯度向量。
- 使用双线性插值在 q1、q2 处计算幅值 M(q1)、M(q2)。
- 若 M(q) 大于 M(q1) 和 M(q2),则保留;否则抑制为 0。
双线性插值(bilinear interpolation):
给定四个格点 Q11=(x1,y1),Q12=(x1,y2),Q21=(x2,y1),Q22=(x2,y2),P=(x,y) 点的双线性插值为:
f(P)=f(Q11)(1−α)(1−β)+f(Q21)α(1−β)+f(Q12)(1−α)β+f(Q22)αβ
其中 α=x2−x1x−x1,β=y2−y1y−y1.
本质上就是按照距离整点的距离比例进行加权。
图1:双线性插值
简化 NMS:
离散化为 8 个方向并直接比较相邻像素。
Hysteresis Thresholding
滞后阈值算法,用以形成连续边缘,可以强化边缘并抑制噪声。
首先确定两个阈值:maxVal,minVal. 可按通过 NMS 的像素平均幅值设定:
maxVal=0.3×averageminVal=0.1×average
对于像素点 q,幅值 M(q):
- 若 M(q)≥maxVal:强边缘,保留并允许连接。
- 若 M(q)<maxVal:非边缘,抛弃。
- 若 minVal≤M(q)<maxVal:弱边缘,仅在与强边缘连通时保留。
边缘增长(Edge Linking)步骤:
- 遍历图像,遇到强边缘开始增长;
- 对当前边缘像素,检查在边缘方向(垂直梯度方向)上的两个相邻像素,若任一像素方向与该像素 bin 相同、幅值足够、通过 NMS 判定,则将其也标记为边缘,并继续增长;
- 循环直到不能继续增长为止。
Canny Edge Detector
上述流程即使标准的 Canny 算法:
- 用导数 Gaussian 计算梯度分量 Gx、Gy。
- 计算梯度幅值和方向。
- 非极大值抑制(NMS)将响应细化到单像素宽。
- 使用滞后阈值并做边缘连接(Hysteresis + Edge Linking)产生最终的边缘线条。
注:
- Canny 算法涉及很多 Hyper Parameter,如 σ、maxVal、minVal. 其中尺度选择(σ)是关键。σ 大时噪声更少但定位差;σ 小时定位好但对噪声敏感。通常对同一图像做多尺度检测以获得更稳健结果。
- 对颜色图像通常先将颜色图像转换为灰度。也可以使用基于颜色梯度的扩展方法(多通道合并或向量梯度)。