图像与视频基础:像素与色彩空间、帧率分辨率、噪声模型
各位同学好,欢迎来到第二章。这一章我们聊点基础,但别小看基础——我见过太多项目栽在这些看似简单的概念上。说白了,像素、色彩、帧率、噪声,这些东西搞不清楚,后面做运动补偿和低光照增强,你连问题出在哪都不知道。
2.1 像素——图像的最小单元
像素是什么?就是一张图里最小的那个点。每个像素存一个颜色值,成千上万个像素拼在一起,就成了我们看到的画面。
我习惯把像素想象成「数字世界的感光细胞」。每个细胞记录一个颜色,细胞越多,画面越细腻。
关键指标: 一张 1920×1080 的图像,总共有 2,073,600 个像素。每个像素通常用 8 位(0-255)或 10 位(0-1023)表示亮度或颜色分量。
2.2 色彩空间——RGB 与 YUV
色彩空间,说白了就是「用哪套规则来描述颜色」。最常用的两套:RGB 和 YUV。
2.2.1 RGB 色彩空间
RGB 用红、绿、蓝三个通道叠加出所有颜色。每个通道 0-255,三个通道组合就是 1600 多万种颜色。显示器、摄像头传感器,基本都是 RGB 的天下。
但 RGB 有个问题——三个通道相关性太强。你调一下亮度,三个通道都得跟着变。这在视频压缩和图像处理里非常不友好。
我的经验: 做低光照增强时,直接在 RGB 上操作容易把颜色搞偏。我一般先把图像转到 YUV,只处理亮度通道,颜色通道保持不动。效果稳得多。
2.2.2 YUV 色彩空间
YUV 把亮度(Y)和色度(U、V)分开。Y 通道存灰度信息,U、V 存颜色信息。人眼对亮度敏感,对颜色不敏感——所以视频压缩时可以对 UV 通道降采样,人眼看不出区别。
常见的 YUV 格式:
| 格式 | 采样方式 | 数据量(相对 RGB) | 典型应用 |
|---|---|---|---|
| YUV 4:4:4 | 每个像素都有 Y、U、V | 与 RGB 相同 | 专业调色、无损编辑 |
| YUV 4:2:2 | 每 2 个像素共享一组 UV | 减少 1/3 | 广播级视频 |
| YUV 4:2:0 | 每 4 个像素共享一组 UV | 减少 1/2 | H.264/H.265 编码、网络视频 |
避坑指南: 我曾经在 YUV 转 RGB 时用错了转换矩阵,结果画面偏绿。折腾了两天才发现是 BT.601 和 BT.709 的系数搞混了。记住:标清用 BT.601,高清用 BT.709。
2.3 视频帧率与分辨率
帧率就是每秒显示多少帧画面,单位 fps。分辨率就是每帧有多少像素。
这两个参数直接决定了视频的流畅度和清晰度,也决定了你的算法要处理多少数据。
2.3.1 常见帧率
- 24 fps:电影标准,有「胶片感」
- 30 fps:电视、网络视频标准
- 60 fps:体育直播、游戏,画面丝滑
- 120/240 fps:慢动作拍摄,后期可以放慢 4-8 倍
做运动补偿时,帧率越高,相邻帧之间的运动位移越小,补偿效果越好。但数据量也越大——这是个 trade-off。
2.3.2 常见分辨率
| 名称 | 分辨率 | 像素数 | 典型场景 |
|---|---|---|---|
| SD (480p) | 720×480 | 0.3M | 老式 DVD |
| HD (720p) | 1280×720 | 0.9M | 入门高清 |
| Full HD (1080p) | 1920×1080 | 2.1M | 主流视频 |
| 4K UHD | 3840×2160 | 8.3M | 高端影视、监控 |
| 8K UHD | 7680×4320 | 33.2M | 前沿设备 |
我的建议: 做低光照增强时,别一上来就上 4K。先用 720p 或 1080p 调通算法,再往高分辨率迁移。否则调试一次跑几分钟,效率太低。
2.4 噪声模型——图像质量的隐形杀手
噪声是什么?就是图像里不该出现的随机波动。低光照环境下,噪声尤其明显。你想想看,光线不足,传感器信号弱,噪声就相对变大了。
做低光照增强,本质上就是在「放大信号」和「抑制噪声」之间找平衡。搞懂噪声模型,是第一步。
2.4.1 高斯噪声
高斯噪声是最常见的噪声模型。它服从正态分布,每个像素独立叠加一个随机值。
数学上:I_noisy = I_clean + N(0, σ²)
σ 越大,噪声越强。高斯噪声通常来自传感器热噪声、电路噪声。
代码示例: 给图像添加高斯噪声
import numpy as np
import cv2
def add_gaussian_noise(image, sigma=25):
noise = np.random.normal(0, sigma, image.shape).astype(np.int16)
noisy = image.astype(np.int16) + noise
noisy = np.clip(noisy, 0, 255).astype(np.uint8)
return noisy
img = cv2.imread('frame.jpg')
noisy_img = add_gaussian_noise(img, sigma=30)
2.4.2 泊松噪声
泊松噪声跟光子计数有关。光线越弱,光子数越少,泊松噪声越明显。它有个特点:噪声强度跟信号强度成正比——亮的地方噪声大,暗的地方噪声小。
数学上:I_noisy = Poisson(I_clean)
泊松噪声在低光照场景下特别突出。我做过一个夜间监控项目,画面暗部全是颗粒感,那就是泊松噪声在作怪。
我的经验: 高斯噪声用高斯滤波就能压住,但泊松噪声不行。泊松噪声需要更复杂的模型,比如 Anscombe 变换把它转成高斯噪声再处理。这个后面章节会细讲。
2.4.3 两种噪声的对比
| 特性 | 高斯噪声 | 泊松噪声 |
|---|---|---|
| 来源 | 热噪声、电路噪声 | 光子计数统计波动 |
| 与信号关系 | 独立,与信号强度无关 | 相关,与信号强度成正比 |
| 分布 | 正态分布 | 泊松分布 |
| 典型场景 | 传感器升温、高 ISO | 低光照、短曝光 |
| 处理方式 | 高斯滤波、双边滤波 | Anscombe 变换 + 高斯滤波 |
避坑指南: 我曾经在低光照增强时只考虑了高斯噪声,结果处理完画面还是脏兮兮的。后来才发现是泊松噪声没处理好。记住:低光照场景下,泊松噪声是主角,高斯噪声是配角。
2.5 本章知识体系
下面这张图把本章的核心概念串起来了。你可以看到像素、色彩空间、帧率分辨率、噪声模型之间的关系。
嗯,这一章的内容就到这里。像素、色彩空间、帧率分辨率、噪声模型——这四个概念是后续所有算法的基础。搞懂了它们,你才能理解为什么运动补偿要做亚像素插值,为什么低光照增强要先做噪声估计。