第 3 章 空间域图像增强
学习目标:掌握”直接在像素空间操作像素/邻域”的所有经典算法。 本章是图像处理教材的”核心应用第一章”,公式密集但直觉清晰——每种技术都对应一个具体的工程问题。
3.1 什么是”空间域”增强?
3.1.1 术语辨析:增强 vs 复原
初学者很容易混淆这两个词:
| 概念 | 目标 | 依据 | 本章讲 | 对应章节 |
|---|---|---|---|---|
| 增强 (Enhancement) | 让图像看起来更好 | 主观视觉、经验 | ✅ | 第 3、4 章 |
| 复原 (Restoration) | 让图像还原为未退化的样子 | 客观模型(PSF、噪声) | ❌ | 第 5 章 |
简记:
- 增强 = 美图秀秀(“好看就行”)
- 复原 = 刑侦降噪(“必须是真实的样子”)
增强的评判标准是主观感受——因此同一张图不同场景下”最好的”增强方法可能不同。
3.1.2 空间域的数学定义
定义 3.1(空间域处理):设输入图像 (f(x, y)),处理算子 (T[\cdot]),输出 [ g(x, y) = T[f(x, y)] ] 则称 (T) 为空间域算子,如果:
- (T) 的输出 (g(x, y)) 仅依赖于 (f) 在点 ((x, y)) 或其某个邻域 (S_{xy}) 内的像素值。
由邻域大小分类:
| 邻域类型 | (S_{xy}) | 名称 |
|---|---|---|
| 单点 | ({(x, y)}) | 点变换 / 灰度映射 |
| 小窗 | (m \times n) 邻域 | 邻域运算 / 空间滤波 |
| 全图 | 整幅图 | 全局变换(如 HE) |
点变换: 邻域运算: ┌───┬───┬───┐ (x, y) │ │ │ │ │ ├───┼───┼───┤ T[·] │ │★ │ │ ← 中心像素 │ ├───┼───┼───┤ ▼ │ │ │ │ g(x, y) └───┴───┴───┘ T[整个窗口]3.1.3 空间域 vs 频率域:地位的等价性
卷积定理(第 4 章详证)保证:任何线性空间邻域运算都可以等价地在频率域用乘法实现: [ g = f * h \quad \Longleftrightarrow \quad G(u,v) = F(u,v) \cdot H(u,v) ]
因此,理论上空间域能做的滤波,频域都能做。选择依据只剩工程层面:
| 场景 | 首选 | 原因 |
|---|---|---|
| 核小(≤ 7×7) | 空间域 | 缓存友好、常数小 |
| 核大(≥ 31×31) | 频率域 | FFT 的 (O(N \log N)) 碾压 (O(N k^2)) |
| 非线性操作(中值、双边) | 空间域 | 频域无定义 |
| 设计带阻/陷波 | 频率域 | 在频域”画一笔”即可 |
记住:空间域直观、频率域优雅。本章学前者,第 4 章学后者,它们是同一枚硬币的两面。
3.2 基本灰度变换(点变换)
3.2.1 通式
定义 3.2(灰度变换 / LUT):无邻域信息的点变换可写为 [ s = T(r), \quad r \in [0, L-1], ; s \in [0, L-1] ] 其中 (r) 是输入灰度,(s) 是输出灰度,(T) 是单调(通常)函数。
工程实现诀窍:把 (T) 预先算成长度 256 的查找表(LUT),然后对整幅图做数组下标取值——这比逐像素算函数快 10-100 倍。
# 把 T 离散化成 LUT,一次性完成table = np.array([T(r) for r in range(256)], dtype=np.uint8)out = table[img] # numpy 高级索引,向量化# 或等价的:cv2.LUT(img, table)3.2.2 图像反转 (Negative)
[ s = L - 1 - r ]
几何含义:(T) 是一条从 ((0, L-1)) 到 ((L-1, 0)) 的直线,经过对角线反射。
应用场景:
- 医学 X 光片:骨骼吸收多 → 胶片亮 → 背景黑;医生习惯看”黑色骨骼白色背景”,反转后更符合直觉。
- 夜间摄影反相:凸显暗部细节。
原图: 0 █████░░░ 255 反转: 0 ░░░█████ 255 暗 → 亮 亮 ← 暗3.2.3 对数变换
[ s = c \cdot \log(1 + r), \quad c = \frac{L - 1}{\log L} ]
加 1 防止 (\log 0)。(c) 的取值使得 (r = L-1) 时 (s = L-1),恰好填满动态范围。
关键性质(必考):
- (r) 小时,(\log) 曲线斜率大 → 暗部被拉伸
- (r) 大时,斜率小 → 亮部被压缩
物理根源(与第 1 章呼应):
- 韦伯定律:人眼对亮度的感知接近对数
- 自然图像的动态范围往往 (10^4) 以上(太阳 vs 阴影),直接显示会丢失大量细节
- 对数变换 ≈ 模拟人眼响应
经典应用——傅里叶频谱可视化:
[
F(u, v) \in [10^{-6}, 10^{8}] \xrightarrow{\log} \log(1 + |F|) \in [0, 20]
]
不做 log,直接 imshow(|F|) 只看到中心一个亮点,其他全黑。这就是为什么第 4 章画频谱永远要先 np.log1p。
3.2.4 幂律变换(Gamma 校正)
[ s = c \cdot r^\gamma ]
单参数 (\gamma):
| (\gamma) | 效果 | 典型值 |
|---|---|---|
| (\gamma < 1) | 拉伸暗部,压缩亮部(类似 log) | 0.4(LCD 补偿) |
| (\gamma = 1) | 无变化(直线) | - |
| (\gamma > 1) | 拉伸亮部,压缩暗部 | 2.2(CRT 物理特性) |
Gamma 的历史渊源(重要!)
CRT 显示器的发光亮度与输入电压的关系近似为: [ L_{\text{display}} = V_{\text{input}}^{2.2} ]
如果图像像素值线性地作为 (V),那么显示出来的亮度 (L) 会比真实场景偏暗。为了补偿,图像在存储时就做 (\gamma = 1/2.2 \approx 0.45) 的反向预处理: [ V_{\text{store}} = L_{\text{scene}}^{1/2.2} ]
sRGB 色彩空间就标准化了这套流程。因此:
- 你看到的
uint8像素值不是线性光强度,而是 gamma 编码后的值 - 做任何线性计算(合成、HDR、去噪)前,要先”解码”:(L = V^{2.2})
- 最后显示前再编码回去
⚠️ 这是图像处理中最大的坑之一。很多算法在 uint8 空间直接平均是错的,在 linear float 空间平均才对。
应用:暗图提亮
# 原图偏暗,用 γ=0.5 提亮gamma = 0.5lut = np.array([((i / 255.0) ** gamma) * 255 for i in range(256)], np.uint8)bright = cv2.LUT(img, lut)3.2.5 分段线性变换
单个幂律或对数都是”全局”变换,有时我们只想操作某段。
对比度拉伸 (Contrast Stretching)
[ s = \begin{cases} \alpha r & 0 \le r < r_1 \ \beta (r - r_1) + s_1 & r_1 \le r < r_2 \ \gamma (r - r_2) + s_2 & r_2 \le r \le L - 1 \end{cases} ]
常用三段折线把 ([r_1, r_2]) 的窄动态范围拉伸到 ([0, L-1]),两侧压扁。
s ▲ L-1 ┤ ╱ │ ╱ │ ╱ ← 陡峭中段:强对比度 │ ╱ │ ╱ 0 ┤─┘ ┌──────────→ r r1 r2极端情形:令 (r_1 = r_2 = T),(\alpha = 0, \gamma = 0, \beta = \infty),退化为阈值化(第 10 章 Otsu)。
灰度切割 (Gray-Level Slicing)
只保留某个灰度区间,其他置 0(或保持原值): [ s = \begin{cases} L-1 & r \in [A, B] \ 0 & \text{otherwise} \end{cases} ] 用于突出特定对象(如 CT 中某密度的组织)。
位平面切片 (Bit-Plane Slicing)
将 8-bit 图拆成 8 张二值图,第 (k) 位图: [ b_k(x, y) = \lfloor f(x, y) / 2^k \rfloor \mod 2 ]
观察(非常重要):
- 高位 (b7, b6):图像的主体结构
- 低位 (b0, b1):几乎是随机噪声
启示:
- 图像压缩只存高 4-5 位损失很小
- 隐写术 (Steganography) 把秘密信息藏在 b0 里,肉眼看不出
- 数字水印、指纹
3.3 直方图处理(本章重点,面试高频)
3.3.1 直方图的严格定义
定义 3.3(离散直方图):对 (L) 级灰度图 (f),直方图是函数 [ h: {0, 1, \ldots, L-1} \to \mathbb{N}, \quad h(r_k) = #{(x, y) : f(x, y) = r_k} ]
归一化直方图(概率密度估计): [ p(r_k) = \frac{h(r_k)}{MN}, \quad \sum_k p(r_k) = 1 ]
解释:(p(r_k)) 是”随机选一个像素,其灰度等于 (r_k)“的概率。
3.3.2 从直方图判读图像
| 直方图形态 | 图像特点 |
|---|---|
| 集中在低灰度 | 偏暗(欠曝) |
| 集中在高灰度 | 偏亮(过曝) |
| 集中在中间窄区 | 低对比度(雾天、阴影) |
| 均匀分布 | 高对比度,细节丰富 |
| 双峰 | 前景 + 背景分明 → 适合阈值分割 |
偏暗: 偏亮: 低对比度: 高对比度:
█ █ █ █ █ █ █ █ █ ██ ██ ████ █ ███ █ ██ ████ █ █ █████ ██████ █████ █ ──────→ ──────→ ──────→ ──────→ 0 255 0 255 0 255 0 2553.3.3 直方图均衡化(HE)——理论推导
这是本章最重要的算法,必须会从头推导。
步骤 1:连续形式
假设灰度 (r) 是连续随机变量,概率密度 (p_r(r)),变换 (s = T(r)) 为单调可微函数。
目标:让输出 (s) 服从均匀分布: [ p_s(s) = \frac{1}{L-1}, \quad s \in [0, L-1] ]
由概率密度的变换公式(雅可比): [ p_s(s) = p_r(r) \left| \frac{dr}{ds} \right| ]
设 [ s = T(r) = (L-1) \int_0^r p_r(w) , dw \equiv (L-1) \cdot F_r(r) ] (即 (r) 的累积分布函数 CDF 乘以 (L-1))
求导: [ \frac{ds}{dr} = (L-1) \cdot p_r(r) ]
代入: [ p_s(s) = p_r(r) \cdot \frac{1}{(L-1) p_r(r)} = \frac{1}{L-1} ]
结论:只要 (T) 取成累积分布函数,输出就一定是均匀分布!
步骤 2:离散形式
[ s_k = T(r_k) = (L-1) \sum_{j=0}^{k} p_r(r_j) = \frac{L-1}{MN} \sum_{j=0}^{k} n_j ] 然后取整: [ s_k \leftarrow \text{round}(s_k) ]
注意:离散 HE 不能得到严格均匀直方图,只是近似。原因是取整合并了某些灰度级。
步骤 3:伪代码
输入:图像 f,大小 MN1. 计算 h[0..255] (直方图)2. 计算 CDF: C[k] = C[k-1] + h[k]3. 归一化: s[k] = round((L-1) * C[k] / MN)4. 输出: g(x, y) = s[ f(x, y) ]import numpy as np
def my_equalize(img, L=256): h, _ = np.histogram(img.ravel(), L, (0, L)) cdf = h.cumsum() cdf_min = cdf[cdf > 0].min() # 关键:减 cdf_min,使得最小值映射到 0 s = np.round((cdf - cdf_min) / (img.size - cdf_min) * (L - 1)).astype(np.uint8) return s[img]HE 的几何直觉
一句话记忆:“把 CDF 当作映射函数”。
- 原图 CDF 中”陡峭”的部分 → 对应直方图高峰 → 被拉伸
- 原图 CDF 中”平坦”的部分 → 对应直方图低谷 → 被压缩
效果是把直方图**“摊平”**。
HE 的局限性
HE 是全局的操作。问题:
- 会放大噪声:平坦区域(如墙面)被不必要地拉伸
- 会丢失局部细节:一张有亮天空 + 暗地面的图,HE 倾向于妥协
- 伪轮廓:离散取整合并灰度级
3.3.4 CLAHE:限制对比度自适应直方图均衡
为解决全局 HE 的局限,Zuiderveld 1994 提出 CLAHE:
核心思想:
- 分块:把图分成 (M \times N) 个小区域(tile,如 8×8)
- 每块独立 HE
- 限幅 (Clip Limit):每块直方图中超过阈值的频次被”削掉”,均匀分给其他 bin
- 双线性插值:像素位置处于几个 tile 之间时,用插值平滑,避免 tile 边界的块状伪影
限幅的意义:
- 若某 bin 的高度远超阈值,说明这里有大块平坦区,做 HE 会放大这里的噪声
- 限幅 = 抑制噪声放大 + 仍保留对比度增强
clahe = cv2.createCLAHE(clipLimit=2.0, tileGridSize=(8, 8))result = clahe.apply(gray)参数经验:
| 参数 | 作用 | 建议 |
|---|---|---|
clipLimit | 噪声抑制强度 | 2-4(越大增强越强) |
tileGridSize | 局部区域大小 | 8×8(随图大小调整) |
CLAHE 在医学成像、低光照相机预处理中几乎是默认选择。
3.3.5 直方图匹配(规定化)
有时我们不想要”均匀”,而想让输出图具有指定的直方图形状 (p_z(z))(来自参考图像)。
推导(利用 HE 的双向性):
- 对输入做 HE:(s = T(r))
- 对参考做 HE:(v = G(z))
- 由于两者 HE 后都是均匀分布,可以匹配:(s \approx v)
- 因此 (z = G^{-1}(s) = G^{-1}(T(r)))
伪代码:
1. 对 src 计算 CDF_s2. 对 ref 计算 CDF_r3. 对每个 r,找最接近的 z 使 CDF_r(z) ≈ CDF_s(r)4. 建立 LUT: r → z应用:
- 多模态医学图像归一化(不同设备亮度分布统一)
- 风格迁移的预处理(把夕阳照片的亮度分布迁移到白天照片)
- 卫星影像时序一致性
3.4 空间滤波的基础理论
3.4.1 核心概念:邻域、核、模板
邻域 (S_{xy}):以 ((x, y)) 为中心的一个小窗口。 核 / 掩模 / 模板 (Kernel / Mask):附着在邻域上的权重矩阵 (w(s, t))。
3.4.2 相关 vs 卷积(必须搞清楚)
这是图像处理的地基性定义,很多人搞混。
相关 (Correlation):核”直接”扫过图像 [ (w \star f)(x, y) = \sum_{s=-a}^{a} \sum_{t=-b}^{b} w(s, t) \cdot f(x+s, y+t) ]
卷积 (Convolution):核先**翻转 180°**再扫 [ (w * f)(x, y) = \sum_{s=-a}^{a} \sum_{t=-b}^{b} w(s, t) \cdot f(x-s, y-t) ]
相关:w 直接"贴"上去 卷积:w 先反射再"贴"
核 w: 反射核 w': 1 2 3 9 8 7 4 5 6 6 5 4 7 8 9 3 2 1几何对称的核(如均值、高斯、拉普拉斯)下,相关 = 卷积。非对称(如 Sobel)下,两者差一个翻转。
为什么信号处理教材偏爱卷积?
因为卷积满足以下良好性质(相关则不满足):
| 性质 | 卷积 | 相关 |
|---|---|---|
| 交换律 | ✅ (f * g = g * f) | ❌ |
| 结合律 | ✅ | ❌ |
| 分配律 | ✅ | ✅ |
| 与 FT 对应 | ✅ (f * g \leftrightarrow F \cdot G) | 部分 |
因此教材公式写卷积,但工程实现用相关(OpenCV filter2D 其实是相关)——对称核下结果一致,非对称核需要事先翻转。
LSI 系统(线性移不变系统)
定义 3.4:若算子 (H) 同时满足
- 线性:(H[\alpha f_1 + \beta f_2] = \alpha H[f_1] + \beta H[f_2])
- 移不变:(H[f(x - x_0, y - y_0)] = g(x - x_0, y - y_0))
则称 (H) 为 LSI 系统。
重要定理:任何 LSI 系统 都等价于与某个固定核做卷积。这是整个”滤波”理论的根基。
3.4.3 边界处理(工程必知)
当核中心靠近图像边界时,邻域”伸出”图像,需要虚构边界外的值。OpenCV 边界类型:
| 标志 | 效果 | 图示 (原始 abcd) |
|---|---|---|
BORDER_CONSTANT | 填指定值(默认 0) | 0000|abcd|0000 |
BORDER_REPLICATE | 复制边缘 | aaaa|abcd|dddd |
BORDER_REFLECT | 反射(不含边缘) | dcba|abcd|dcba |
BORDER_REFLECT_101 | 反射(含边缘)默认 | dcb|abcd|cba |
BORDER_WRAP | 循环 | abcd|abcd|abcd |
经验选择:
- 一般滤波:
REFLECT_101(最平滑) - 卷积神经网络:
CONSTANT(0)(简单,配合 padding) - DFT 计算:
CONSTANT(0)或WRAP(对应循环卷积)
3.5 平滑(低通)滤波
目标:减少灰度剧烈变化,也就是抑制高频。用途:
- 去噪
- 减小细节(模糊背景、美化肤色)
- 作为其他算法的预处理(如 Canny、SIFT、特征匹配)
3.5.1 均值滤波(Box / Moving Average)
定义
核: [ w = \frac{1}{mn} \begin{bmatrix} 1 & 1 & \cdots & 1 \ \vdots & & & \vdots \ 1 & 1 & \cdots & 1 \end{bmatrix}_{m \times n} ]
数学推断:为什么能去噪?
假设观测 (f(x, y) = s(x, y) + \eta(x, y)),(\eta) 是零均值独立噪声,方差 (\sigma^2)。
对 (m \times n) 邻域求平均: [ \bar{f} = \bar{s} + \bar{\eta} ]
由于独立:(\text{Var}(\bar{\eta}) = \sigma^2 / (mn))。
结论:噪声标准差降低为原来的 (1 / \sqrt{mn})。核越大去噪越狠,但同时也模糊了信号,这就是”去噪-保边”的根本矛盾。
缺点
- 对边缘(信号的高频成分)同样模糊,造成”糊边”
- 核呈矩形→ 频域为 sinc → 通带外有旁瓣 → 产生”箱效应”
工程加速:积分图
均值滤波可以用积分图 (Summed Area Table) 做 (O(1)) 每像素:
S(x, y) = f(x, y) + S(x-1, y) + S(x, y-1) - S(x-1, y-1)区域和 = S(x2,y2) - S(x1-1,y2) - S(x2,y1-1) + S(x1-1,y1-1)3.5.2 高斯滤波(最常用平滑)
定义
[ G_\sigma(x, y) = \frac{1}{2\pi \sigma^2} \exp\left( -\frac{x^2 + y^2}{2 \sigma^2} \right) ]
核心参数 (\sigma)(标准差):
- (\sigma) 小 → 核窄 → 轻微模糊
- (\sigma) 大 → 核宽 → 重度模糊
核尺寸经验公式:(k = \lceil 6\sigma + 1 \rceil)(奇数),即取到 (3\sigma) 处(覆盖 99.7% 能量)。
高斯的三大优良性质
性质 1:可分离性
[ G_\sigma(x, y) = G_\sigma(x) \cdot G_\sigma(y) ]
即二维高斯 = 两个一维高斯的乘积。这意味着 (k \times k) 卷积可以拆成两次 (k) 点一维卷积:
| 实现 | 复杂度 |
|---|---|
| 直接二维卷积 | (O(k^2)) 每像素 |
| 先行后列可分离 | (O(2k)) 每像素 |
(k=25) 时加速 12 倍以上。OpenCV 内部自动分离。
性质 2:时频同形
高斯函数的傅里叶变换仍然是高斯: [ \mathcal{F}{G_\sigma} = G_{1/\sigma} ]
- 空间上窄 (\Leftrightarrow) 频率上宽
- 不产生振铃(Gibbs)——无旁瓣
这使高斯成为最优 LSI 低通(在时频同时最紧)。
性质 3:中心极限定理
多次卷积趋近高斯:任意核 (h) 自我卷积 (h * h * \cdots * h) (n 次),(n \to \infty) 时趋近高斯分布。
工程含义:多次均值滤波可以近似高斯滤波。
实现要点
# 方式 1:推荐blur = cv2.GaussianBlur(img, (0, 0), sigma) # k=0 表示按 σ 自动算
# 方式 2:手动指定 kblur = cv2.GaussianBlur(img, (5, 5), 1.0)金科玉律:指定 (\sigma) 比指定核大小更重要。
3.5.3 中值滤波(非线性)
定义
[ g(x, y) = \text{median}{f(s, t) : (s, t) \in S_{xy}} ]
非线性:不能写成 (g = w * f)。
为什么对椒盐噪声有效?
- 椒盐噪声 = 孤立极值(0 或 255)
- 邻域 (n) 像素中,少数几个异常值一定排在排序的极端
- 中值取中间 → 异常值被”投票丢弃”
- 边缘像素仍是多数,因此边缘保留较好
均值 vs 中值的对比
| 特征 | 均值 | 中值 |
|---|---|---|
| 数学类型 | 线性 | 非线性 |
| 对高斯噪声 | 最优(MMSE) | 可用但不如均值 |
| 对椒盐噪声 | ❌ 扩散脉冲 | ✅ 强鲁棒 |
| 边缘保留 | ❌ 糊边 | ✅ 好 |
| 可分离 | ✅ | ❌ |
| 复杂度 | 可 (O(1)) | 每点排序 (O(k \log k)) |
高级变体
- 加权中值滤波:对邻域位置加权(离中心远的权重小)
- 自适应中值滤波:窗口自动扩大直到能找到非极值,极端椒盐(>50%)下仍有效
- Vector Median (VMF):用于彩色图,避免”新颜色”
3.5.4 双边滤波(保边滤波的经典)
动机
高斯滤波只看空间距离,把边缘两侧的像素一起平均 → 糊边。 双边滤波同时考虑空间距离和灰度差异:只平均灰度相近的邻居 → 保边去噪。
公式
[ g(x, y) = \frac{1}{W(x,y)} \sum_{(s,t) \in S} f(s, t) \cdot G_{\sigma_s}(|(x,y) - (s,t)|) \cdot G_{\sigma_r}(|f(x,y) - f(s,t)|) ]
其中 (W) 是归一化因子: [ W(x, y) = \sum_{(s,t) \in S} G_{\sigma_s}(\cdots) \cdot G_{\sigma_r}(\cdots) ]
分解理解:
- (G_{\sigma_s}):空间高斯(离中心越远权重越小)
- (G_{\sigma_r}):灰度高斯(灰度差越大权重越小)
- 两者相乘 → 既近又相似的邻居才参与平均
参数直觉
| 参数 | 含义 | 效果 |
|---|---|---|
d | 邻域直径(或 (\sigma_s) 推算) | 大 → 平滑范围大 |
sigmaColor ((\sigma_r)) | 灰度差容忍度 | 大 → 接近高斯平滑(失去保边) |
sigmaSpace ((\sigma_s)) | 空间衰减速度 | 同上 |
经典选择(8-bit 图):
- 磨皮美颜:
d=9, sigmaColor=50, sigmaSpace=50 - 轻度去噪:
d=5, sigmaColor=20, sigmaSpace=5
复杂度问题
原始实现 (O(k^2)) 每像素,不可分离(因为 (G_r) 依赖于中心像素)。
加速算法:
- Bilateral Grid (Paris 2006)
- Permutohedral Lattice
- Guided Filter (He 2010):线性时间,效果接近,常被替代
3.5.5 非局部均值 (NLM)
思想:不只看邻域,而看全图中相似的 patch。
[ g(x) = \sum_{y \in \text{Image}} w(x, y) f(y), \quad w(x, y) \propto \exp\left( -\frac{|P(x) - P(y)|^2}{h^2} \right) ]
(P(x)) 是以 (x) 为中心的小 patch(如 7×7)。
直觉:在自然图像中,同一内容(如墙面纹理)会在不同位置重复出现。平均这些重复的 patch 能极大程度去噪而保持结构。
缺点:原始 (O(N^2)) 很慢,OpenCV fastNlMeansDenoising 做了加速(但还是几种方法中最慢的)。
BM3D 是 NLM 的升级版:对相似 patch 堆叠做 3D 变换 + 协同滤波,是非深度方法中的SOTA。
3.5.6 平滑方法对比表
| 方法 | 类型 | 高斯 | 椒盐 | 保边 | 速度 | 复杂度 |
|---|---|---|---|---|---|---|
| 均值 | 线性 | ✅ | ❌ | ❌ | 极快 | (O(1))* |
| 高斯 | 线性 | ✅✅ | ❌ | ❌ | 快 | (O(k)) |
| 中值 | 非线性 | ⚪ | ✅✅ | ⚪ | 中 | (O(k\log k)) |
| 双边 | 非线性 | ✅ | ⚪ | ✅ | 慢 | (O(k^2)) |
| NLM | 非线性 | ✅ | ⚪ | ✅✅ | 极慢 | (O(N \cdot P)) |
* 积分图加速
3.6 锐化(高通)滤波
目标:突出灰度剧变(边缘、细节)。基于微分。
3.6.1 从微分到差分
连续函数的微分: [ \frac{\partial f}{\partial x} = \lim_{\Delta x \to 0} \frac{f(x + \Delta x) - f(x)}{\Delta x} ]
离散图像只能用差分。有三种方案:
| 差分 | 公式 | 精度 |
|---|---|---|
| 前向 | (f(x+1) - f(x)) | 1 阶 |
| 后向 | (f(x) - f(x-1)) | 1 阶 |
| 中心 | (\frac{f(x+1) - f(x-1)}{2}) | 2 阶 |
实际用中心差分,精度高且对称。
3.6.2 一阶微分算子
梯度向量
图像梯度: [ \nabla f = \begin{bmatrix} g_x \ g_y \end{bmatrix} = \begin{bmatrix} \partial f / \partial x \ \partial f / \partial y \end{bmatrix} ]
幅值 (magnitude): [ M(x, y) = |\nabla f| = \sqrt{g_x^2 + g_y^2} ]
方向 (angle): [ \theta(x, y) = \arctan(g_y / g_x) ]
梯度的几何意义:
- 幅值 → 边缘强度
- 方向 → 边缘法线(垂直于边缘)
Roberts 交叉梯度
[ g_x = \begin{bmatrix} 1 & 0 \ 0 & -1 \end{bmatrix}, \quad g_y = \begin{bmatrix} 0 & 1 \ -1 & 0 \end{bmatrix} ]
2×2、对角差分。缺点:对噪声敏感、没有对称中心。已被淘汰。
Prewitt 算子(3×3)
[ g_x = \begin{bmatrix} -1 & 0 & 1 \ -1 & 0 & 1 \ -1 & 0 & 1 \end{bmatrix}, \quad g_y = \begin{bmatrix} -1 & -1 & -1 \ 0 & 0 & 0 \ 1 & 1 & 1 \end{bmatrix} ]
每一行”平均”三行后求差分 → 自带平滑,比 Roberts 抗噪。
Sobel 算子(最常用)
[ g_x = \begin{bmatrix} -1 & 0 & 1 \ -2 & 0 & 2 \ -1 & 0 & 1 \end{bmatrix}, \quad g_y = \begin{bmatrix} -1 & -2 & -1 \ 0 & 0 & 0 \ 1 & 2 & 1 \end{bmatrix} ]
Prewitt 的基础上给中央行加权 2 → 更强的平滑。 Sobel 是所有经典算子中平滑与定位平衡最好的。
Sobel 核的分解(再次体现可分离): [ g_x = \begin{bmatrix} 1 \ 2 \ 1 \end{bmatrix} \otimes \begin{bmatrix} -1 & 0 & 1 \end{bmatrix} ] 第一项是平滑(高斯近似),第二项是差分。
Scharr 算子
[ g_x = \begin{bmatrix} -3 & 0 & 3 \ -10 & 0 & 10 \ -3 & 0 & 3 \end{bmatrix} ]
相比 Sobel 更强调中心行,有更好的旋转不变性(各向同性更接近理想)。
3.6.3 二阶微分:拉普拉斯算子
定义
[ \nabla^2 f = \frac{\partial^2 f}{\partial x^2} + \frac{\partial^2 f}{\partial y^2} ]
二阶差分: [ \frac{\partial^2 f}{\partial x^2} \approx f(x+1, y) - 2 f(x, y) + f(x-1, y) ]
两方向相加: [ \nabla^2 f \approx f(x+1,y) + f(x-1,y) + f(x,y+1) + f(x,y-1) - 4f(x,y) ]
核(4-邻域): [ L_4 = \begin{bmatrix} 0 & 1 & 0 \ 1 & -4 & 1 \ 0 & 1 & 0 \end{bmatrix} ]
8-邻域版本加上对角: [ L_8 = \begin{bmatrix} 1 & 1 & 1 \ 1 & -8 & 1 \ 1 & 1 & 1 \end{bmatrix} ]
性质
- 各向同性(旋转不变,(L_8) 更接近理想)
- 中心权重为负(其他行权重之和 = 中心绝对值)→ 直流(DC)响应为 0,对平坦区无响应
- 边缘处正负过零点 (zero-crossing) → 标记边缘位置
灰度跃变: 一阶导: 二阶导: ___ ___ ▲ ___ ▲ │ ▲ ___ │ │ │ ───── ───── │ ▼ 过零点!3.6.4 锐化的核心思想
原理:原图 + 适当比例的边缘图 → 锐化图。
拉普拉斯锐化
[ g(x, y) = f(x, y) - c \cdot \nabla^2 f(x, y) ]
为什么是减号? 因为拉普拉斯核中心为负 ((-4) 或 (-8)),公式等价于 [ g = f + c |\nabla^2 f| ] 直觉:在边缘处(二阶导绝对值大)增强原像素。
非锐化掩蔽 Unsharp Masking(专业后期锐化)
流程:
f ── 高斯模糊 ──> f_blur │ └──── 减 ──> mask = f - f_blur (高频信息) │ │ × k ▼f ──── 加 ──> g = f + k × mask公式: [ g = f + k \cdot (f - \text{Blur}(f)) ]
参数 k:
- (k = 1):标准 Unsharp
- (k > 1):High-Boost 滤波(强锐化)
- (k < 0):变为平滑(极端情况)
为什么 Unsharp Masking 比拉普拉斯好?
- (\sigma) 可调 → 可控”锐化尺度”(只锐化大尺度边缘还是细节)
- 可选用双边代替高斯 → 锐化细节但不放大噪声(人像修图常用)
经典商用锐化参数(Photoshop 风格)
| 参数 | 作用 | 典型值 |
|---|---|---|
| Amount | (k) | 50-200% |
| Radius | (\sigma) | 1-3 |
| Threshold | 屏蔽小幅差异 | 0-20 |
3.6.5 梯度与二阶微分的对比
| 特征 | 梯度 (一阶) | 拉普拉斯 (二阶) |
|---|---|---|
| 响应”台阶状边缘” | 厚线(峰) | 过零点(薄线) |
| 响应”缓坡” | 持续响应 | 起止点响应 |
| 对噪声 | 较鲁棒 | 极敏感(需先平滑 → LoG) |
| 方向信息 | ✅((\theta)) | ❌ |
| 用途 | Canny、特征检测 | 斑点检测、锐化 |
3.7 高阶算法:结合应用流水线
3.7.1 经典图像增强流水线
原图 │ ├─ Step 1: Gamma 校正 (压缩动态范围) │ ├─ Step 2: CLAHE (局部对比度) │ ├─ Step 3: 双边/NLM (保边去噪) │ ├─ Step 4: Unsharp Mask (锐化细节) │ └─ Step 5: 可选 sRGB → Linear 再处理 ▼输出3.7.2 工业例子:手机 HDR
步骤:
- 捕获多曝光(-2EV, 0, +2EV)
- 对齐 (光流/特征)
- 融合:Mertens 曝光融合(多分辨率金字塔,第 7 章)
- 色调映射 (Tone Mapping):log/gamma
- 局部对比度:CLAHE
- 去噪:NLM / BM3D
- 锐化:Unsharp Mask
- sRGB 编码
3.8 本章要点与面试考点
✅ 必须掌握
- 点变换通式 (s = T(r)),LUT 工程实现
- Gamma、对数变换的公式与曲线形状
- 直方图均衡化 完整推导(从 CDF 到离散实现)
- CLAHE 的两个关键词:分块 + 限幅
- 均值/高斯/中值/双边的公式、直觉、适用噪声、复杂度
- 高斯的三大性质:可分离、时频同形、中心极限
- Sobel / Laplacian 模板与符号
- Unsharp Masking 公式
💡 高频面试题
Q1. 推导直方图均衡化的变换函数。
要点:设 (s = T(r)),要求 (p_s) 均匀 → 由 (p_s = p_r / |ds/dr|) → (T(r) = (L-1) \int_0^r p_r dw) = CDF × (L-1)。
Q2. 均值滤波为什么会糊边?
答:边缘处像素灰度发生突变,均值把两侧灰度拉向中值 → 边界两侧的对比度被削弱。可以从频域理解:均值核 FT 为 sinc,对高频(边缘)抑制不充分,但仍降低其幅度。
Q3. 如何选择 Gaussian σ?
答:(\sigma) 决定”模糊尺度”,经验公式 (k = 6\sigma + 1) 覆盖 99.7% 能量。工程中:
- 去中等噪声 σ=1
- Canny 预处理 σ=1-2
- 磨皮 σ=3-5
Q4. 给定含椒盐噪声的图,用哪种滤波?
答:中值滤波。均值/高斯会把脉冲”扩散”成 smooth 斑点;中值取排序中点,极值自动被抛弃。如果椒盐比例很高(>30%),用自适应中值。
Q5. 双边滤波为什么能保边?
答:相比高斯,多了一项灰度差高斯。当邻域像素灰度与中心差异大(即穿过边缘),权重急剧下降 → 只平均边缘同一侧的像素,边缘不被跨越平均。
Q6. Unsharp Masking 与拉普拉斯锐化的差别?
答:
- 拉普拉斯:直接用二阶导;对噪声极敏感,且尺度固定(3×3)
- Unsharp:用 Gaussian Blur 的差;可通过 σ 控制”锐化尺度”,可用双边抑噪 → 工程首选
Q7. HE 为什么在某些图上效果很差?
答:HE 是全局操作。当图中存在明显光照差异(如半边阳光半边阴影)时,HE 用统一 CDF 无法兼顾;过度拉伸平坦区域会放大噪声。→ 换 CLAHE 解决。
Q8. 高斯核为什么被广泛使用?
三大原因:
- 可分离 → 实现快
- 傅里叶对偶为高斯 → 无振铃,时频紧
- 中心极限定理 → 多次其他低通的极限都趋近高斯,所以它是”最自然”的低通
3.9 延伸阅读
- Gonzalez, Digital Image Processing (4th ed.), Ch. 3(空间域全章)
- Szeliski, Computer Vision (2nd ed.), §3.1-3.3
- Burger & Burge, Principles of Digital Image Processing: Fundamentals, Ch. 4-5
- Pratt, Digital Image Processing, Ch. 9
- Paris & Durand, “A Fast Approximation of the Bilateral Filter”(2006,SIGGRAPH)
- Zuiderveld, “Contrast Limited Adaptive Histogram Equalization”(1994,Graphic Gems IV)
下一章:把所有空间域滤波”搬到”频率域去,看它们换了一种面貌会多么优雅——那就是卷积定理的威力。
如果這篇文章對你有幫助,歡迎分享給更多人!
部分資訊可能已經過時





















