空间域滤波
直接在像素上操作 · 灰度变换、直方图均衡、平滑(均值/中值/高斯)与锐化(梯度/Sobel/拉普拉斯)。
🎯学习目标
- 理解空间域增强 $g(x,y)=T[f(x,y)]$ 的基本概念;
- 掌握灰度变换(反转、对数、幂次/伽马、灰度分层、比特平面);
- 理解直方图及直方图均衡化、直方图匹配的原理;
- 区分相关与卷积,掌握模板(掩膜)运算;
- 掌握平滑滤波器:均值、加权均值、中值、最大/最小值;
- 掌握锐化滤波器:一阶梯度(Roberts/Prewitt/Sobel)、二阶拉普拉斯。
1图像增强概述
图像增强:增加像素灰度值的动态范围,提升整体对比度与可视性。分两类:
| 类别 | 处理对象 |
|---|---|
| 空间域增强 | 对图像像素直接处理:g(x,y) = T[f(x,y)] |
| 频域增强 | 对图像的傅里叶变换处理(见第3章) |
简化形式 $s = T(r)$:$r$ 是原图任一点灰度级,$s$ 是处理后灰度级,$T$ 是定义在 $(x,y)$ 邻域上的操作。
空间域增强(本章内容):
• 直接修改像素的灰度值
• 就像直接在照片上"涂改"
• 操作简单,速度快
频域增强(下一章内容):
• 先转换到频率域,处理后再转回来
• 就像先"翻译"成另一种语言,处理后再"翻译"回来
• 更适合处理周期性噪声
公式 g(x,y) = T[f(x,y)] 的意思:
• f(x,y) = 原始图像在 (x,y) 处的灰度
• T = 操作(比如变亮、变暗、反转)
• g(x,y) = 处理后的灰度
举例:让图像变亮
• T = "加50"
• g(x,y) = f(x,y) + 50
• 所有像素都变亮50
2灰度变换(点运算)
反转变换
Negative对数变换
Log幂次/伽马
Power-law反转变换:把照片变成"底片"效果,黑变白、白变黑。用途:X光片有时候需要反过来看。
对数变换:把暗的地方变亮,亮的地方不变,就像"提亮阴影"。用途:看清楚很暗的照片细节。
伽马变换(γ):γ < 1 → 照片变亮(像加了亮度);γ > 1 → 照片变暗(像降低了亮度);γ = 1 → 不变。用途:调节显示器亮度。
• 公式:s = (L-1) - r
• 例子:L=256时,s = 255 - r
• 效果:黑变白,白变黑
• 用途:X光片反转查看
2. 对数变换:提亮阴影
• 公式:s = c × log(1 + r)
• 效果:暗处变亮,亮处变化不大
• 用途:查看很暗的照片细节
• 类比:像把"压缩"的暗部"展开"
3. 幂次变换(伽马):调节亮度
• 公式:s = c × r^γ
• γ < 1:变亮(像加了亮度)
• γ > 1:变暗(像降低了亮度)
• γ = 1:不变
• 用途:显示器伽马校正
4. 灰度分层:突出某个范围
• 把关心的灰度范围变亮
• 其他范围变暗或不变
• 用途:医学图像中突出病变区域
伽马变换的实际应用:
• 显示器校正:显示器的亮度响应不是线性的
• 伽马校正就是用 γ 来补偿
• 通常 γ ≈ 2.2
灰度级分层与比特平面
- 灰度级分层:突出某个灰度范围——可将关心范围置高值、其它置低值(或保持不变)。
- 比特平面分层:8 bit 像素 = 8 个 1 位平面(b₇…b₀)。高位平面(如前4位)含大部分视觉重要信息,低位平面含细微细节。可分析每一位的相对重要性。
核心意思:
灰度变换 = 对每个像素单独做数学运算,就像给照片加"滤镜"
举个例子:
原图像素值:[100, 150, 200, 50]
反转变换:s = 255 - r
结果:[155, 105, 55, 205]
效果:黑变白,白变黑(底片效果)
对数变换:s = c × log(1 + r)
结果:[暗处变亮,亮处变化不大]
效果:像"提亮阴影"
伽马变换:s = c × r^γ
γ=0.5:[100→127, 150→155, 200→179, 50→89] 变亮
γ=2.0:[100→39, 150→88, 200→157, 50→10] 变暗
生活类比:
- 反转:像把照片变成底片
- 对数:像把暗处"拉"亮
- 伽马:像调节显示器亮度
为什么这样设计:
因为不同场景需要不同的亮度调整:
- X光片:反转后更清晰
- 夜景照片:对数变换提亮
- 显示器校正:伽马变换
核心意思:
比特平面分层 = 把8位图像拆成8个1位图像,每位代表不同重要程度的信息
举个例子:
一个像素的灰度值:178(十进制)= 10110010(二进制)
拆分成8个比特平面:
第7位(最高位):1 ← 最重要,决定亮暗大趋势
第6位:0
第5位:1
第4位:1
第3位:0
第2位:0
第1位:1
第0位(最低位):0 ← 最不重要,只有细微差别
重要性对比:
高位平面(b7-b4):
- 包含图像的主要结构和轮廓
- 人眼容易识别
- 去掉后图像严重失真
低位平面(b3-b0):
- 包含图像的细节和噪声
- 人眼几乎看不出差别
- 去掉后图像基本不变
应用:
- 图像压缩:只保留高位平面
- 水印:把信息藏在低位平面
- 特征提取:用高位平面作为特征
生活类比:
- 高位平面:像文章的大纲和标题
- 低位平面:像文章的标点符号和格式
- 你读文章主要看大纲,标点符号不太影响理解
3直方图处理
灰度级在 $[0,L-1]$ 的图像,直方图是离散函数 $p(r_k)=n_k/n$($n_k$ 为灰度 $r_k$ 的像素数,$n$ 为总数)。
直方图均衡化
目标:使像素占满全部灰度级且分布均匀,获得高对比度。用灰度变换 $s=T(r)$,$T(r)$ 须满足:① 在 $[0,L-1]$ 单值且单调递增;② $r \in [0,L-1]$ 时 $s \in [0,L-1]$。
连续情形(变换函数取累积分布函数 CDF):
$$s = T(r) = (L-1) \int_0^r p_r(w) dw$$
离散情形:
$$s_k = T(r_k) = (L-1) \sum_{j=0}^{k} p_r(r_j) = (L-1) \sum n_j / n$$
直方图匹配(规定化)
希望输出图像具有指定的直方图形状。设 $p_z(z)$ 为指定密度,分别对 $r$ 做均衡 $s=T(r)$、对 $z$ 做均衡 $G(z)$,再令 $z=G^{-1}(s)$。
原因:像素值都挤在一起,没有拉开差距
直方图均衡化做的事:
• 把挤在一起的像素值"拉开"
• 让最暗的变成 0,最亮的变成 255
• 中间的也均匀分布
效果:原本灰蒙蒙的照片 → 变得清晰、对比度高,就像把一张褪色的照片"修复"好。
• 每个灰度值有多少个像素
• 就像统计一个班的成绩分布
直方图的形态:
• 集中在左边 → 图像偏暗
• 集中在右边 → 图像偏亮
• 集中在中间 → 对比度低(灰蒙蒙)
• 均匀分布 → 对比度好
直方图均衡化 = "让分布均匀"
问题:照片看起来"灰蒙蒙"
原因:像素值都挤在某个区间
解决:把挤在一起的像素值"拉开"
具体做法:
1. 统计每个灰度值的像素数
2. 计算累积分布
3. 重新映射灰度值
效果:
• 原本集中在 100-150 的像素
• 被拉伸到 0-255 的整个范围
• 图像变得清晰、对比度高
直方图匹配(规定化)= "让分布变成指定形状"
• 均衡化是让分布变成"均匀"
• 匹配是让分布变成"任意指定形状"
• 更灵活,但更复杂
核心意思:
直方图均衡化 = 把"灰蒙蒙"的照片变得清晰,让像素值分布更均匀
举个例子:
原图的直方图(像素值分布):
灰度值 像素数
0-50 100
50-100 800 ← 大部分像素集中在这里
100-150 100
150-200 0
200-255 0
问题:像素都挤在 50-100 这个区间,图像看起来"灰蒙蒙"
均衡化后的直方图:
灰度值 像素数
0-50 200
50-100 200
100-150 200
150-200 200
200-255 200
效果:像素均匀分布在整个 0-255 范围,图像变得清晰
生活类比:
就像把一堆挤在一起的人"拉开",让他们均匀分布在房间里。
为什么这样设计:
因为很多照片因为光照或拍摄问题,像素值分布不均匀,看起来"灰蒙蒙"。
4空间滤波与模板(掩膜)
空间滤波:使用空间模板进行的图像处理;模板本身称为空间滤波器(掩膜)。在 $M \times N$ 图像 $f$ 上用 $m \times n$ 滤波器:
$$g(x,y) = \sum_{s=-a}^{a} \sum_{t=-b}^{b} w(s,t) \cdot f(x+s, y+t)$$
其中 $$m=2a+1, n=2b+1$$(奇数尺寸),$$w(s,t)$$ 为滤波器系数
简化形式:$$R = \sum w_i \cdot z_i$$ ($$z_i$$ 为模板覆盖的图像灰度值,$$mn$$ 为像素总数)
核心意思:
空间滤波 = 用模板在图像上滑动,对邻域像素做加权求和
举个例子:
3×3均值滤波模板:
1/9 1/9 1/9
1/9 1/9 1/9
1/9 1/9 1/9
处理过程:
原始图像(部分):
100 120 130
110 125 135
115 128 138
计算:
R = (100+120+130+110+125+135+115+128+138) / 9
R = 1121 / 9 ≈ 124.6
输出:124.6(替换中心像素)
不同模板的效果:
模板 效果
均值模板 模糊(去噪)
高斯模板 更平滑的模糊
锐化模板 增强边缘
边缘检测模板 找出边缘
模板大小的影响:
3×3模板:轻微模糊
5×5模板:中等模糊
7×7模板:严重模糊
生活类比:
- 模板:像一个"权重分配器"
- 滑动过程:像用一个小窗口在图像上扫描
- 加权求和:像"投票",权重大的像素有更大发言权
为什么模板大小要是奇数?
因为需要一个中心像素,偶数大小的模板没有明确的中心。
核心意思:
边界处理 = 模板滑到图像边缘时,缺少的像素怎么处理
举个例子:
3×3模板处理5×5图像,滑到位置(0,0)时:
模板位置:
[?] [?] [?]
[?] [P] [→]
[?] [↓] [↘]
问题:左上角的[?]位置没有像素!
四种处理方法:
1. 补零填充:
把[?]当作0
结果:边缘会变暗(因为0是黑色)
2. 复制填充:
把[?]复制最近的边缘像素
结果:边缘保持原来的亮度
3. 镜像填充:
把[?]用镜像像素填充
结果:边缘过渡最自然
4. 裁剪:
只处理模板完全覆盖的区域
结果:输出图像比输入小一圈
对比:
方法 优点 缺点 补零 简单 边缘变暗 复制 保持亮度 边缘可能不自然 镜像 过渡自然 计算量大 裁剪 无边界问题 图像变小
生活类比:
- 补零:像用黑色背景
- 复制:像用边缘颜色填充
- 镜像:像用镜子反射
- 裁剪:像裁掉边缘
5相关与卷积 ⭐
| 操作 | 是否旋转滤波器 | 说明 |
|---|---|---|
| 相关 Correlation | 不旋转 | 模板按原样在图像上滑动求加权和 |
| 卷积 Convolution | 先旋转 180° | 模板翻转后再滑动;卷积是空间域与频率域过滤的纽带 |
相关(Correlation):
• 模板直接在图像上滑动
• 不翻转模板
• 计算加权和
卷积(Convolution):
• 先把模板旋转180度
• 再在图像上滑动
• 计算加权和
为什么卷积要旋转?
• 数学上更优雅
• 频域乘法 = 空域卷积(需要旋转)
• 实际效果差别不大
卷积的步骤:
1. 把模板放在图像上
2. 对应位置相乘
3. 把所有乘积加起来
4. 结果写到中心像素
5. 滑动到下一个位置
6. 重复直到扫完整张图
边界处理 = "边缘怎么办"
四种处理方式:
1. 补零:边缘外面用0填充
2. 复制:复制最近的边缘像素
3. 镜像:边缘外面用镜像填充
4. 裁剪:只处理完整覆盖的部分
选择建议:
• 补零:简单,但边缘可能变暗
• 复制:保持边缘亮度
• 镜像:最自然,但计算量大
• 裁剪:图像会变小
核心意思:
卷积 = 用一个小窗口在图像上滑动,每到一个位置就计算一次加权和
举个例子:
用 3×3 的卷积核处理 5×5 的图像:
输入图像:
1 2 3 4 5
6 7 8 9 0
1 2 3 4 5
6 7 8 9 0
1 2 3 4 5
卷积核(边缘检测):
-1 -1 -1
-1 8 -1
-1 -1 -1
计算过程(在位置(1,1)):
窗口:1 2 3
6 7 8
1 2 3
计算:1×(-1) + 2×(-1) + 3×(-1) +
6×(-1) + 7×8 + 8×(-1) +
1×(-1) + 2×(-1) + 3×(-1)
= -1 + -2 + -3 + -6 + 56 + -8 + -1 + -2 + -3
= 30
生活类比:
就像用放大镜看照片,每到一个位置就看看周围的像素,然后计算一个新值。
为什么这样设计:
因为很多图像处理操作(模糊、锐化、边缘检测)都可以用卷积实现。
6平滑空间滤波器 ⭐
模糊处理:去除不重要细节、减小噪声。分两类:
| 类型 | 滤波器 | 特点 |
|---|---|---|
| 线性 | 均值 / 加权均值滤波器 | 邻域平均;减小灰度尖锐变化与噪声,但边缘也被模糊 |
| 非线性(统计排序) | 中值滤波器 | 取邻域中间值;去噪同时较好保留边缘 |
| 最大值滤波器 | 取邻域最大值,寻找最亮点 | |
| 最小值滤波器 | 取邻域最小值,寻找最暗点 |
均值滤波器
取邻域像素平均值。模板越大(3×3→5×5→…→35×35)模糊越强。加权均值让某些像素(如中心)更重要。
中值滤波器
把模板内像素排序取中间值:$R = \text{mid}\{z_k \mid k=1 \ldots n\}$。强迫突出的亮/暗点更接近周围值,消除孤立点。
- 3×3 第 5 大为中值,5×5 第 13 大,7×7 第 25 大,9×9 第 41 大;同值像素连续排列。
- 能有效去除椒盐噪声(脉冲噪声)——随机出现的黑/白点,其灰度往往不是中值,故被排除。
- 去噪同时保留边的锐度与细节,优于均值滤波器。
均值滤波(取平均):
• 策略:看看周围邻居,取平均值
• 问题:会把噪声"扩散"开,边缘变模糊
• 就像:把脏东西抹开,但没擦掉
中值滤波(取中间值):
• 策略:看看周围邻居,取中间那个值
• 优点:噪声直接被"跳过"了,边缘保持清晰
• 就像:发现异常值直接忽略
结论:去椒盐噪声用中值滤波更好!
• 图像有噪声(随机的亮点/暗点)
• 噪声会干扰后续处理
• 平滑可以去除噪声
均值滤波器 = "取平均"
原理:看看周围邻居,取平均值
• 就像"投票",少数服从多数
• 噪声通常和周围不一样,会被"平均掉"
公式:R = (z1 + z2 + ... + zn) / n
优点:简单,能去噪
缺点:边缘也变模糊了
中值滤波器 = "取中间值"
原理:看看周围邻居,取中间那个值
• 就像"排序后取中位数"
• 噪声通常是最亮或最暗的,会被"跳过"
公式:R = median(z1, z2, ..., zn)
优点:去噪同时保持边缘清晰
缺点:计算量比均值大
对比:
• 均值:把噪声"摊开",边缘模糊
• 中值:把噪声"剔除",边缘清晰
什么时候用哪个?
• 均值:噪声是高斯噪声(正态分布)
• 中值:噪声是椒盐噪声(随机黑白点)
核心意思:
均值滤波 = 取平均,中值滤波 = 取中间值,两者都能去噪但效果不同
举个例子:
有噪声的像素值:[100, 105, 95, 300, 110, 100, 90, 105, 100]
(300 是噪声点)
均值滤波:
排序:[90, 95, 100, 100, 100, 105, 105, 110, 300]
计算:(90+95+100+100+100+105+105+110+300) / 9 = 122.2
结果:122.2(噪声被"平均"了,但边缘也模糊了)
中值滤波:
排序:[90, 95, 100, 100, 100, 105, 105, 110, 300]
取中间值:100
结果:100(噪声被"跳过"了,边缘保持清晰)
对比:
方法 结果 优点 缺点
均值 122.2 简单 边缘模糊
中值 100 保边 计算稍慢
生活类比:
- 均值:像"投票",少数服从多数
- 中值:像"排序后取中间",异常值被忽略
为什么这样设计:
什么时候用哪个?
- 高斯噪声(正态分布):用均值
- 椒盐噪声(随机黑白点):用中值
7锐化空间滤波器 ⭐
锐化:突出细节、增强被模糊的边缘。原理:均值(积分)→ 钝化;微分 → 锐化。常用梯度。
一维一阶导数:$$\frac{\partial f}{\partial x} = f(x+1) - f(x)$$
一维二阶导数:$$\frac{\partial^2 f}{\partial x^2} = f(x+1) + f(x-1) - 2f(x)$$
① 一阶微分(梯度法)
梯度是二维列向量 $\nabla f = [\frac{\partial f}{\partial x}, \frac{\partial f}{\partial y}]^T$,幅值 $M(x,y)=\sqrt{(\frac{\partial f}{\partial x})^2+(\frac{\partial f}{\partial y})^2} \approx |G_x|+|G_y|$。常用算子(3×3 区域 $z_1 \ldots z_9$,中心 $z_5$):
| 算子 | 模板 / 公式 |
|---|---|
| Roberts 交叉 | 2×2 模板:$G_x=z_9-z_5$,$G_y=z_8-z_6$ |
| Prewitt | $M = |(z_7+z_8+z_9)-(z_1+z_2+z_3)| + |(z_3+z_6+z_9)-(z_1+z_4+z_7)|$ |
| Sobel | $M = |(z_7+2z_8+z_9)-(z_1+2z_2+z_3)| + |(z_3+2z_6+z_9)-(z_1+2z_4+z_7)|$ 中心系数为 2,突出中心点起平滑作用 |
② 二阶微分:拉普拉斯算子
各向同性的二阶微分。最常见模板中心为 -4(或 -8),模板系数和为 0(平坦区域无响应,只对突变响应)。增强公式:
当中心系数为负:$$g(x,y) = f(x,y) - \nabla^2 f(x,y)$$ $$= 5f(x,y) - [f(x+1,y)+f(x-1,y)+f(x,y+1)+f(x,y-1)]$$ (4邻域版)
• 照片可能有点模糊
• 锐化能让边缘更清晰
• 就像给照片"对焦"
锐化的原理:
• 平滑 = 积分 = 模糊
• 锐化 = 微分 = 找变化
一阶微分(梯度)= 找"变化最大的方向"
• 就像找"山坡最陡的方向"
• 梯度大的地方 = 边缘
二阶微分(拉普拉斯)= 找"变化的变化"
• 就像找"山坡的弯曲程度"
• 拉普拉斯大的地方 = 边缘中心
常用算子:
Roberts算子(2×2):
• 最简单,只看2×2区域
• 对噪声敏感
Prewitt算子(3×3):
• 看3×3区域
• 有平滑作用
Sobel算子(3×3):
• 中心权重更大(乘以2)
• 平滑效果更好
• 最常用
拉普拉斯算子:
• 二阶微分
• 各向同性(旋转不变)
• 对噪声敏感
核心意思:
锐化 = 找边缘 = 让图像更清晰,原理是"微分找变化"
举个例子:
原图的一行像素:[100, 100, 100, 200, 200, 200]
(在位置3有个边缘,从100跳到200)
一阶导数(梯度):
位置:[0, 1, 2, 3, 4, 5]
梯度:[0, 0, 100, 100, 0, 0]
解释:在边缘处梯度很大(100),其他地方梯度很小(0)
二阶导数(拉普拉斯):
位置:[0, 1, 2, 3, 4, 5]
拉普拉斯:[0, 0, 100, -100, 0, 0]
解释:在边缘处有正负变化,边缘中心为0
常用算子对比:
算子 大小 特点
Roberts 2×2 最简单,对噪声敏感
Prewitt 3×3 有平滑作用
Sobel 3×3 中心权重更大,最常用
生活类比:
- 锐化就像给照片"对焦"
- 一阶导数:找"山坡最陡的方向"
- 二阶导数:找"山坡的弯曲程度"
为什么这样设计:
因为照片可能有点模糊,锐化能让边缘更清晰。
⭐重点例题
10 20 30
40 50 60 均值 = (10+20+30+40+50+60+70+80+90)/9
70 80 90 = 450 / 9 = 50
中心由 50 → 50(此例恰好不变,因数据线性递增、中心即均值)。
解:排序 (10,15,20,20,20,20,20,25,255),第 5 大(中值)= 20。中心 255 → 20,孤立白点被消除。
对比:均值 =(10+15+20+20+20+255+20+25+20)/9 ≈ 45,噪声被"摊开"且偏离真实值,中值更优。
$G_x=|(z_7+2z_8+z_9)-(z_1+2z_2+z_3)|=|(9+18+9)-(1+2+1)|=|36-4|=32$;
$G_y=|(z_3+2z_6+z_9)-(z_1+2z_4+z_7)|=|(1+2+9)-(1+2+9)|=0$。
$M=G_x+G_y=$32(检测到水平边缘)。
🎯自测(点击展开)
空间域增强的一般表达式是什么?
伽马变换 γ<1 和 γ>1 分别使图像变亮还是变暗?
直方图均衡化的变换函数本质是什么?
相关与卷积的根本区别?
去椒盐(脉冲)噪声为什么优先用中值滤波?
拉普拉斯模板系数和为什么是 0?
📝强化题库
选择题点选即时判分;填空题输入后"检查"或"显示答案"。