图像数字化原理【细化扩充完整版|采样 + 量化 + 编码,考点 + 原理 + 代码 + 易错点】
现实世界光线、景物是连续模拟信号(时域 / 空域连续、亮度连续) ,计算机只能存储离散数字,一张实景变成矩阵图像必经:采样 → 量化 → 编码三步,是整张图像处理理论根基。
1.1 采样 Sampling(空间离散化:坐标由连续→离散)
本质:在连续二维平面上等间距抽取坐标点,只保留采样位置的亮度,其余舍弃,实现空间维度离散。
1.1.1 空间采样(静态图片)
- 采样间隔Ts:相邻两个像素的物理距离;
- Ts越小 → 采样密度越高 → 分辨率越高、细节越丰富;
- Ts越大 → 采样稀疏 → 分辨率低、马赛克、细节丢失。
- 分辨率定义:W×H = 横向采样点数 × 纵向采样点数
- 1080P:1920 (宽采样数)×1080 (高采样数)
- 4K:3840×2160,同等尺寸画布采样点数量≈4 倍 1080P
- 奈奎斯特采样定理(采样核心考点) 图像细节对应空间高频信号,采样频率必须>2 倍图像最高空间频率,否则发生混叠失真(摩尔纹、锯齿)。
例:斜条纹布料拍照出现诡异彩色波纹 = 采样不足导致混叠。
1.1.2 时域采样(动态视频)
视频是连续时序画面,对时间轴等间隔采样:FPS(帧率)=每秒时域采样画面数量
- 24FPS:1s 内采集 24 张静态图像;
- FPS 过低:画面卡顿、拖影(时域采样不足)。
补充:采样实操
OpenCV 图像缩放降分辨率 = 人为减少采样点:
python
运行
import cv2
img = cv2.imread("test.jpg")
# 缩小=减少采样点数,分辨率下降
img_low = cv2.resize(img,(320,240))
1.2 量化 Quantization(亮度离散化:灰度由连续→有限整数)
采样只固定了像素位置,每个采样点的亮度依旧是连续实数;量化:把无穷连续的亮度区间,划分成N个区间,同一区间内所有亮度统一映射成同一个整数值。
1.2.1 量化级数与位深关系
N=2BitDepth
表格
| 位深 | 量化级数N | 像素取值范围 | 应用场景 |
|---|---|---|---|
| 1bit | 21=2 | 0,1 | 二值黑白图、文档扫描 |
| 8bit | 28=256 | 0∼255 | 日常 JPG/PNG、OpenCV 默认图像 |
| 16bit | 216=65536 | 0∼65535 | 相机 RAW 原图、医学 CT、工业视觉 |
| 32bit 浮点 | 连续 | 0.0∼1.0 | 深度学习归一化图像、中间计算图 |
1.2.2 量化误差 & 量化失真
量化取整带来的亮度差值 = 量化误差。
- 量化级数越少(位深越低)→误差越大;
- 典型失真:色带(色调分层):天空渐变、墙面渐变从平滑过渡变成一块一块阶梯色块。
实操:8bit 转 1bit(二值化)是极端量化,大量灰度被合并,细节丢失严重。
python
运行
# 低量化演示:把0~255压缩为4个灰度等级(2bit)
img = cv2.imread("test.jpg",0)
img_quant = (img//64)*64
1.2.3 均匀量化 / 非均匀量化
- 均匀量化(通用图像):每个灰度区间宽度相等,8bit 图像等分 0~255;
- 非均匀量化(JPG、人眼优化):人眼对暗部更敏感,暗部量化区间更小、级数更密,亮部区间更大,同等 bit 下肉眼画质更好。
1.3 编码 Encoding(数据压缩存储,减少磁盘占用)
采样 + 量化完成后,原始裸数据(BMP 格式)体积极大,编码就是按照特定算法对像素矩阵压缩、规整格式,生成图片文件。
1.3.1 无损编码(压缩后解码和原图像素完全一致,无画质损失)
压缩原理:利用像素重复冗余(大面积纯色、连续相同灰度),不丢弃任何像素信息
- BMP:无压缩原始位图,直接存储全部像素,体积最大;
- PNG:DEFLATE 无损压缩,支持 Alpha 透明通道;
- TIFF:工业无损格式,支持 16bit 高位深图像。
1.3.2 有损编码(丢弃人眼不敏感高频细节,大幅压缩体积)
压缩时剔除图像高频信息(细小纹理、细微噪点),解压无法还原原始像素:
- JPEG:基于 DCT 离散余弦变换,丢弃高频细节;压缩率越高画质越差;
关键坑:JPG 反复保存 = 多次有损压缩,画质逐级劣化、越来越糊。
拓展串联知识点(衔接前文)
- 采样 → 决定图像分辨率 (H,W)
- 量化 → 决定图像位深、像素取值范围 (uint8/uint16)
- 编码 → 决定**文件格式 (JPG/PNG/BMP)**三者共同决定一张图片的内存占用:单张 8bit 1920×1080 灰度原图裸内存:1920×1080×1 Byte