Appearance
数字图像处理
概念
数字图像是把连续的光强分布,在空间和幅度两个维度上都离散化之后得到的一个数值矩阵。
两个离散化动作各有名字:
| 动作 | 离散哪一维 | 参数 | 代价 |
|---|---|---|---|
| 采样 | 空间 | 分辨率 | 细节丢失、混叠 |
| 量化 | 幅度 | 位深 | 出现台阶(伪轮廓) |
这一章是美术课里唯一"可以直接在计算机上做"的部分:所有操作都是矩阵运算。这也正是它标 ★ 的原因——它是"美术"与"计算机"两条线真正共用同一套语言的地方。
与数字音频对照看,结构完全相同:采样 → 量化 → 编码,只是采样的维度从"时间"变成"空间",还原设备从 DAC 变成显示器。同一套理论,两个感官。
原理
图像的内存占用
这个公式是所有图像工程问题(缓存、带宽、显存、传输)的起点:图像是"大"数据,一张 4000 × 3000 的 16 位彩色图就是 72 MB(见示例 1)。
点运算:逐像素独立变换
点运算只依赖当前像素值,不依赖邻居,因此是最快的一类运算(可完全并行)。
| 运算 | 公式 | 作用 |
|---|---|---|
| 灰度化 | 三通道 → 单通道 | |
| 亮度/对比度 | 线性拉伸/平移 | |
| 反相 | 负片 | |
| 阈值 | 二值化 | |
| 伽马校正 | 非线性明暗调整 |
灰度化系数的来历:0.299 / 0.587 / 0.114 就是色彩学里 sRGB 相对亮度权重的简化版(0.2126 / 0.7152 / 0.0722)。两组权重都反映同一生理事实——绿色最亮、蓝色最暗;BT.601 是早期电视标准,BT.709 是高清标准。用错了不会"崩",但灰阶会偏(示例 2 会看到具体差多少)。
直方图与直方图均衡
直方图
累积分布函数 CDF:
直方图均衡把原图 CDF 拉直,映射公式(
原理:CDF 在像素密集的灰度区间上升快、稀疏区间上升慢。乘以
代价:它是"全局"的,会放大背景噪声,且对局部过亮/过暗区域无能无力(需要局部均衡/CLAHE)。
空间滤波:卷积
卷积是空间域滤波的统一形式:
| 核 | 矩阵 | 作用 |
|---|---|---|
| 均值 | 平滑、去噪(也模糊边缘) | |
| 高斯 | 平滑(保边缘略好、无振铃) | |
| Sobel-X | 检测竖直边缘 | |
| Sobel-Y | 检测水平边缘 | |
| Laplacian | 各向同性二阶微分,用于锐化 |
三条必须记住的性质:
- 核的和决定整体亮度:和为 1 → 亮度不变(均值、高斯);和为 0 → 平均亮度变 0(Sobel、Laplacian),因此梯度/边缘图的均值必然是 0 或近 0。
- 边界必须处理:超出图像范围的像素要么补 0(dark padding,会在边缘造成变暗),要么复制(replicate),要么镜像。"处理的图边缘一圈发暗"通常就是补零造成的(示例 4 会量化它)。
- 高斯核可分离:2D 高斯等于两次 1D 高斯,计算量从 9 次乘法降到 3+3 = 6 次(大核收益更明显,
)。这是工程上最重要的优化之一。
边缘与梯度
用 Sobel 得到
- 幅值
是"边缘强度",用于阈值化得到边缘图; - 方向
是"灰度增长最快的方向",即梯度方向。
关键概念辨析:梯度方向垂直于边缘走向。一条水平的边缘(上下灰度跳变),梯度竖直(
图像放大与插值
放大时,目标像素对应到源图上的坐标往往落在非整数位置,需要插值:
| 方法 | 用到的源像素 | 特点 |
|---|---|---|
| 最近邻 | 1 | 最快、有锯齿 |
| 双线性 | 4 | 平滑、略糊 |
| 双三次 | 16 | 最平滑、有轻微振铃 |
双线性:对周围 4 个像素按距离加权(横竖各一次线性插值)。
颜色空间:为什么还要 YCbCr
人眼对亮度的分辨力远高于对色度的分辨力。YCbCr 把亮度
| 采样格式 | 每像素样本数 | 相对 4:4:4 节省 |
|---|---|---|
| 4:4:4 | 3 | — |
| 4:2:2 | 2 | 33.3% |
| 4:2:0 | 1.5 | 50% |
"4:2:0 省一半数据而看不出差别",是视频压缩能成立的第一块基石——这也正是"感知编码"思路(见数字音频的心理声学)在图像上的对应物。
频域视角
卷积定理:
空间域卷积 = 频域相乘。于是:
- 均值/高斯核 → 低通滤波(截掉高频,即模糊);
- Sobel/Laplacian → 高通滤波(保留高频,即边缘)。
核越大 → 频域带宽越窄 → 越模糊。这与数字音频里"
示例
例 1:几种常见图像的内存占用
按
| 图像 | 尺寸 | 通道 | 位深 | 字节数 | MB | MiB |
|---|---|---|---|---|---|---|
| 全高清 RGB | 1920 × 1080 | 3 | 8 | 6 220 800 | 6.22 | 5.93 |
| 4K RGB | 3840 × 2160 | 3 | 8 | 24 883 200 | 24.88 | 23.73 |
| 专业相机 RGB | 4000 × 3000 | 3 | 16 | 72 000 000 | 72.00 | 68.66 |
| 灰度小图 | 512 × 512 | 1 | 8 | 262 144 | 0.26 | 0.25 |
| 全高清 RGBA | 1920 × 1080 | 4 | 8 | 8 294 400 | 8.29 | 7.91 |
1920 × 1080 的推导:
注意 MB 与 MiB 相差约 4.7%(1 MiB = 1.048576 MB,故 6 220 800 字节既是 6.22 MB、又只是 5.93 MiB)——"我的 8 GB 内存装不下 8 GB 的图"往往就是这两个单位混用造成的。
4K 的像素数是全高清的 4 倍(
例 2:灰度化的两套权重
对 RGB(200, 150, 100):
同一颜色,两套标准相差 2.23 级灰度(159.25 vs 157.02)。单张图看不出,但整批处理的图混用两套标准,会出现可见的明暗断层——所以"统一系数"比"选哪套"更重要。
例 3:点运算——亮度与对比度
取
| 输入 | 计算 | 输出 |
|---|---|---|
| 100 | 86 | |
| 128 | 128 | |
| 200 | 236 |
三条要点:
- 128 是"支点",对比度拉伸不动它——这就是为什么要以中灰为轴,而不是以 0 为轴;
会削顶:输入 220 会得 ,必须截断到 255,高光细节就此永久丢失;- 只调
是平移(整体变亮/变暗),只调 是拉伸(对比度)。两者是不同的操作,不要混用同一条滑块。
例 4:直方图均衡的完整过程
用一张 4 × 4、灰度只有 4/5/6 三档的低对比图像(8 灰阶,
| 第 1 行 | 4 | 4 | 4 | 5 | | 第 2 行 | 4 | 5 | 5 | 5 | | 第 3 行 | 5 | 5 | 5 | 6 | | 第 4 行 | 5 | 6 | 6 | 6 |
第 1 步:统计直方图(灰度 0–7)
| 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | |
|---|---|---|---|---|---|---|---|---|
| 0 | 0 | 0 | 0 | 4 | 8 | 4 | 0 |
第 2 步:累积 CDF
| 4 | 5 | 6 | 7 | |
|---|---|---|---|---|
| CDF | 4 | 12 | 16 | 16 |
第 3 步:映射
| 计算 | ||
|---|---|---|
| 4 | 2 | |
| 5 | 5 | |
| 6 | 7 |
第 4 步:输出直方图
| 2 | 5 | 7 | |
|---|---|---|---|
| 计数 | 4 | 8 | 4 |
结果:原图灰度跨度只有
但也要看清代价:原图 4 与 5 之间的细微差别被拉成了 2 与 5 之间的巨大差别,噪声同步被放大。直方图均衡是"用噪声换对比度"的交易——这正是它在低照度照片上"越处理越花"的原因。
例 5:3 × 3 均值滤波与边界的问题
源图(5 × 5,中心为峰值):
| 行 \ 列 | 1 | 2 | 3 | 4 | 5 |
|---|---|---|---|---|---|
| 1 | 10 | 10 | 10 | 10 | 10 |
| 2 | 10 | 20 | 20 | 20 | 10 |
| 3 | 10 | 20 | 30 | 20 | 10 |
| 4 | 10 | 20 | 20 | 20 | 10 |
| 5 | 10 | 10 | 10 | 10 | 10 |
按 3 × 3 均值核(除以 9)、边界补零处理:
| 5.5556 | 8.8889 | 10.0000 | 8.8889 | 5.5556 |
| 8.8889 | 15.5556 | 17.7778 | 15.5556 | 8.8889 |
| 10.0000 | 17.7778 | 21.1111 | 17.7778 | 10.0000 |
| 8.8889 | 15.5556 | 17.7778 | 15.5556 | 8.8889 |
| 5.5556 | 8.8889 | 10.0000 | 8.8889 | 5.5556 |
中心点的推导:邻域和
读这张表能读出三件事:
- 峰值从 30 降到 21.11——平滑必然"削峰";
- 四个角从 10 降到 5.5556(降了 44.4%)——这就是补零的代价:边界外的"0"被算成了真实像素。改边界策略(复制/镜像)即可消除这个暗边;
- 输出只有 21.1111、17.7778、15.5556、10.0、8.8889、5.5556 六个不同值,且关于中心完全对称——因为源图与核都对称,卷积结果必然对称。这是检验实现是否正确的一条捷径。
例 6:Sobel 边缘检测
检测竖直方向的边缘用 Sobel-Y(上下灰度跳变处响应最强)。取中心的
| 位置 | 3 × 3 邻域 | 方向 | |||
|---|---|---|---|---|---|
| (1,2) | 10 10 10 / 20 20 20 / 20 30 20 | 0 | 60 | 60.0000 | 90.00° |
| (2,2) | 20 20 20 / 20 30 20 / 20 20 20 | 0 | 0 | 0.0000 | — |
| (2,3) | 20 20 20 / 20 30 20 / 10 10 10 | −60 | 0 | 60.0000 | 180.00° |
三个结论:
- 正中心
的梯度为 0——它是完全对称的局部峰,"最亮的地方不是边缘"; 的 (梯度竖直),但边缘是水平的 —— 再次确认:梯度方向 ⊥ 边缘走向; 的 ,符号与 相反,说明这两处是同一条边缘的两侧——梯度的符号编码了"往哪边变亮",这一点在哈夫变换的直线方向判定上至关重要。
例 7:Laplacian 锐化
Laplacian 是二阶微分,用于增强高频(细节与边缘):
用
峰值从 30 提高到 70,而平坦区域(如四边的 10)Laplacian 为 0,保持不变。
这就是锐化的本质:只抬高变化大的地方,不动平坦的地方。反过来也说明了它的副作用——噪声也是"变化大的地方",所以锐化必然同时放大噪声("先降噪后锐化"的顺序由此而来)。
例 8:中值滤波 vs 均值滤波(去椒盐噪声)
取一个含两个极值噪声的 3 × 3 邻域:
| 行 \ 列 | 1 | 2 | 3 |
|---|---|---|---|
| 1 | 0 | 0 | 10 |
| 2 | 12 | 200 | 12 |
| 3 | 11 | 10 | 255 |
排序:0, 0, 10, 10, 11, 12, 12, 200, 255
| 方法 | 结果 | 评价 |
|---|---|---|
| 中值滤波 | 11 | 噪声被完全剔除 |
| 均值滤波 | 被 200 与 255 严重带偏 |
中值滤波为什么有效:极值噪声在排序后必然落在两端,中位数取的是中间位置,与两端值无关——只要噪声点不超过窗口的一半,就被彻底忽略。而均值是线性运算,一个 255 的噪声点会把均值拉高
代价:中值滤波对细节与小尺寸目标破坏更大(细线可能被整条抹掉),且计算量大(需排序)。"椒盐噪声用中值、高斯噪声用均值/高斯"是标准搭配。
例 9:双线性插值
源图 2 × 2:
| 行 \ 列 | 1 | 2 |
|---|---|---|
| 1 | 10 | 20 |
| 2 | 30 | 40 |
目标点落在源坐标
落在
结果必然落在四个源值的最小与最大之间(10–40)——这是双线性插值的"保序/不越界"性质,也是它不会产生振铃的原因;双三次插值没有这条性质,会在尖锐边缘处产生轻微过冲(看起来更锐,也可能更假)。
核的支撑点数:最近邻 1 个、双线性 4 个、双三次 16 个——质量与计算量同步增长,这是工程上永恒的取舍。
例 10:RGB → YCbCr 与色度降采样
| RGB | 8 位 (Y, Cb, Cr) | |||
|---|---|---|---|---|
| (255, 0, 0) 红 | 76.24 | 84.97 | 255.50 | (76, 85, 255) |
| (0, 255, 0) 绿 | 149.69 | 43.53 | 21.23 | (150, 44, 21) |
| (0, 0, 255) 蓝 | 29.07 | 255.50 | 107.27 | (29, 255, 107) |
三个原色的
注意
4:2:0 采样:每像素样本数从 3 降到 1.5,数据量减少 50%,而由于人眼对色度不敏感,主观质量几乎不变。这是 JPEG、H.264、H.265 共同采用的默认格式。
例 11:伽马与 8 × 8 DCT 的量化
伽马:线性亮度 0.5 编码为 sRGB 得
JPEG 的 8 × 8 DCT:把图像分成 8 × 8 块(共 64 个系数),做离散余弦变换。对一块全为 128 的图像:
- DC 系数
** - 其余 63 个 AC 系数全为 0(块内没有任何变化)
亮度量化表的
完全无损——因为 1024 恰好是 16 的整数倍。
这个例子说明了 JPEG 的两个本质:
- 平坦区域几乎不占数据量(63/64 的系数为 0,游程编码后几乎免费);
- 量化是有损的,但"损失多少"取决于是否落在量化格的整数倍上——所以 JPEG 的损失是按块、按频率选择性发生的:低频(DC 与低阶 AC)保得多,高频(细节与噪声)丢得多。
这正是"高压缩比下细节先糊、平坦区仍干净"的原因,也是它与音频里"同时掩蔽/临界频带"异曲同工的感知编码思想。
例 12:4K 视频的带宽
12 位 RAW、3840 × 2160、3 通道、60 fps:
这意味着 1 分钟 134.4 GB、1 小时 8.06 TB——任何"拍 RAW 视频"的方案,瓶颈都不在传感器而在存储带宽。
对比:JPEG 把 4000 × 3000 × 3(36 MB)压到约 4 MB,压缩比 9:1。从 36 MB 到 4 MB 的 9 倍,和色度降采样的 2 倍、DCT 量化的高频丢弃,是同一套"用感知换数据"的组合拳。
要点
要点与常见误区
- 两个离散化动作要分开说:采样离散空间(产生混叠,靠抗混叠滤波解决)、量化离散幅度(产生伪轮廓,靠抖动/提高位深解决)。混为一谈会导致归因错误。
- 内存
:4K RGB 8 位 = 24.88 MB;分辨率是二维的,边长翻倍、数据量变四倍。MB 与 MiB 相差约 4.7%,别混用。 - 灰度系数有两套:BT.601 的 0.299/0.587/0.114 与 BT.709 的 0.2126/0.7152/0.0722,同一颜色差 2.23 级灰度(159.25 vs 157.02)。整批处理必须统一,否则出现明暗断层。
- 对比度拉伸的支点是 128(中灰),不是 0;
必然削顶(输入 220 × 1.5 = 266 → 截断 255),高光细节永久丢失。 - 核的和决定亮度:和为 1 → 亮度不变(均值/高斯);和为 0 → 平均亮度归零(Sobel/Laplacian),所以梯度图的均值必然是 0 或近 0。
- 边界补零会造成边缘变暗:示例中四角由 10 降到 5.5556(−44.4%)。看到"处理完边缘一圈发暗",先查边界策略。
- 高斯核可分离:
,3 × 3 的乘法从 9 次降到 6 次。这是空间滤波最重要的工程优化。 - 梯度方向 ⊥ 边缘走向:水平边缘 → 梯度竖直(
)。搞反这一条,非极大值抑制与直线检测全错。 - 梯度符号编码"往哪边变亮":同一水平的边缘两侧
分别为 0 与 −60,符号相反。 - "最亮的地方不是边缘":对称峰中心(例 6 的
)梯度为 0.0000;边缘检测找的是变化,不是亮度。 - 直方图均衡是"用噪声换对比度":示例中灰度跨度由 2 扩到 5(2.5 倍),完全自动无参数,但噪声同步放大——低照度照片越处理越花的原因就在这里。
- 去椒盐噪声用中值,不用均值:同一邻域,中值 11、均值 56.67(被 200 与 255 带偏)。中值对极值免疫,均值不免疫。
- 插值核支撑点数 1 / 4 / 16(最近邻 / 双线性 / 双三次);双线性结果必落在四源值区间内(不越界、不振铃),双三次会过冲。
- YCbCr 的 Cb、Cr 需加 128 偏移并钳位到 [0,255]:红的
已超界。未钳位是自写图像代码最常见的 bug。 - 4:2:0 色度降采样省 50% 数据而几乎看不出差别——这是"用感知换数据"的第一块基石。
- 图像的"中间灰"是 188 而不是 128(伽马)。混合、羽化、渐变若忽略伽马会整体偏暗。
- JPEG 的损失是选择性的:8 × 8 块中平坦区域 63/64 个系数为 0;低频保得多、高频丢得多,所以高压缩下"细节先糊、平坦区仍干净"。
小结
- 数字图像 = 二维数值矩阵;两个离散化动作:采样(空间,产生混叠)+ 量化(幅度,产生伪轮廓)。与数字音频的"采样—量化—编码"三步完全同构。
- 内存
:全高清 RGB = 6.22 MB / 5.93 MiB,4K RGB = 24.88 MB,4000 × 3000 × 16 位 = 72 MB;分辨率是二维的。 - 点运算:灰度化(BT.601 与 BT.709 差 2.23 级)、对比度
(支点 128, 削顶)、伽马(线性 0.5 → 188)。 - 直方图均衡:
;示例中跨度由 2 扩到 5,代价是噪声同步放大。 - 卷积:均值为 1 保亮度、Sobel/Laplacian 和为 0 归零;边界补零导致边缘变暗(−44.4%);高斯可分离(
)。 - 边缘:
、 ;梯度 ⊥ 边缘(水平边缘 → );对称峰中心梯度为 0;梯度符号表示变亮方向。 - 锐化:Laplacian
, 使峰值 30 → 70,平坦区不变——锐化必然放大噪声。 - 去噪:椒盐用中值(11)、高斯用均值/高斯(均值 56.67 被极值带偏)。
- 插值:核支撑点 1 / 4 / 16;双线性权重示例 → 25.0000 / 22.5000。
- 颜色空间:
(绿最亮 149.69、蓝最暗 29.07);4:2:0 省 50%;Cb/Cr 必须加 128 并钳位。 - 压缩:8 × 8 DCT 的 DC = 1024,量化表
→ 64 → 1024,完全无损;平坦块 63/64 系数为 0。 - 带宽:4K60 12 位 RAW = 17.92 Gbps = 2.24 GB/s,1 小时 8.06 TB;JPEG 36 MB → 4 MB(9:1)。
👉 这条线在主线上的落点(本章标 ★ 的原因):图像处理的每一步,在主线里都有对应的正式章节——
- 图像就是二维数组:像素矩阵的遍历、滑窗、按行列访问,正是 数据结构 里"数组与矩阵"的直接应用;卷积的滑动窗口在实现上就是用空间局部性换效率(见 计算机组成原理 的 Cache 一章)。
- 卷积、插值、DCT、卷积定理:属于 数学(矩阵运算、离散卷积)与 分支 · 电子与通信(信号与系统、数字信号处理)的正式内容;本章只用了结论,推导在那里展开。图像滤波与音频滤波是同一套数学,只是一个在空间域、一个在时域。
- 定点整数、位深、截断与钳位:
削顶、 超界,本质都是 计算机组成原理 里"用有限位表示有限范围,必然要在范围与精度之间取舍"的问题——与浮点数的舍入误差是同一类错误。 - 像素级并行与 SIMD:点运算与卷积是天然可向量化的负载,这正是 计算机组成原理 里流水线与阵列处理器的用武之地。
- 压缩与带宽:4K60 RAW 的 17.92 Gbps 远超网络与存储能力,计算机网络 的"带宽是稀缺资源"在这里有最直白的体现——JPEG 的 9:1、色度降采样的 2:1,都是在为带宽买单。
- 图像文件与内存映射:一张 72 MB 的图如何被读入、缓存、写回,是 操作系统 的文件与内存管理问题;而**"图像即数组"这一认知本身,就来自 程序语言 里"数据在内存中如何排布"。**
一句话收束整门美术课:素描给出观察方法(形体与明暗),色彩给出感知规律(亮度、对比与冷暖),透视给出空间规则(投影与灭点),中外美术史提供上下文(每个风格为何出现),设计基础回答组织问题(形式法则与网格),书法与摄影是两种极端的手上功夫(一个压缩到笔画,一个放大到光),而数字图像处理交代载体——一笔颜色最终如何变成可计算的数字。
评论(0)
当前浏览器不允许本地存储,评论无法保存。
还没有评论,来说两句。