一句话定义
图像在计算机中是按行列采样、量化为有限整数或浮点值的像素矩阵,一个或多个通道(灰度、RGB、HSV 等)共同构成它的数字表示。
为什么重要
所有视觉算法的第一输入都是这个矩阵:理解分辨率、位深、通道与坐标约定,是读懂任何后续处理(滤波、投影、卷积)的前提;工程事故里相当一部分来自对通道顺序、数据类型、坐标轴方向的误解,而不是算法本身。
直观类比
把图像想象成一张超大城市网格地图:每个交叉路口(像素)记录了几个数字(通道值),整张地图就是矩阵;相机成像相当于把连续的光场压扁、采样成这份离散档案,压扁和采样的方式决定了你后面能看到什么。
前置知识
本库知识点 kp-001 为入口站,无前置知识点;建议先具备库外的 NumPy 数组基本操作。
核心概念
- 像素(Pixel):图像的最小采样单元,记录一个或多个数值。
- 分辨率(Resolution):宽 × 高的像素数,如 1920×1080。
- 位深(Bit Depth):每个通道值的量化精度,8 位取值 0–255,16 位取值 0–65535;深度网络常用 float32 或归一化到 0–1 的 float。
- 通道(Channel):灰度图 1 个通道,RGB 彩色图 3 个通道,带透明度的 PNG 是 4 通道(RGBA)。
- 色彩空间(Color Space):描述颜色的坐标系。RGB 面向显示设备;HSV(色相、饱和度、明度)更贴近人类直觉,常用于颜色阈值分割;Lab 把明度与色度分开,对光照变化更稳健。
- 坐标约定:图像处理约定原点在左上角,x 向右、y 向下;这与数学中的笛卡尔系(y 向上)相反,是初学者的第一大坑。
原理与机制
数字图像由「采样」与「量化」两步形成:连续光场先被传感器以固定间隔采样成网格(采样率对应分辨率),再把每个采样点的连续亮度映射到有限整数(量化对应位深)。采样不足产生马赛克与锯齿,量化不足产生色带。灰度化并非简单平均,而是按人眼对绿色最敏感的特性加权。OpenCV 出于历史原因按 BGR 顺序存储彩色图像,而 Matplotlib、PIL 等按 RGB 解释,混用会造成「红蓝互换」的诡异颜色。
公式与模型
常用 BT.601 加权灰度化:
Gray = 0.299·R + 0.587·G + 0.114·B归一化到网络输入区间:
x_norm = x / 255 (8 位图 → 0 到 1)HSV 中色相 H 用角度 0–360 度表示,饱和度 S 与明度 V 在 0–1 区间,三者可由 RGB 经非线性变换互相推导,此处只需记住「HSV 把颜色判断从三个耦合变量拆成独立旋钮」。
图示
实例与案例
一张 1920×1080 的 8 位 RGB 图在内存中占 1920×1080×3 ≈ 6.2 MB。读取时若误用 RGB 库直接显示 OpenCV 读入的数据,人脸会泛蓝;若把 16 位医学影像按 8 位读取,亮度层级会被截断成色带。颜色分割任务(如隔离黄色安全帽)通常先转到 HSV,再对 H 通道设阈值,避免 RGB 三通道随光照同时漂移。
import cv2
img = cv2.imread('frame.jpg') # BGR, uint8, 形状 (H, W, 3)
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
print(img.shape, img.dtype) # (1080, 1920, 3) uint8常见误区
- x 与 y 顺序:NumPy 形状是 (高 H, 宽 W),索引写作
img[y, x];写成img[x, y]在非正方形图像上会越界或取错像素。 - RGB 与 BGR 混用:OpenCV 读入是 BGR,转给 RGB 系工具前要
cvtColor。 - 把量化误差当噪声:色带是量化位数不足造成的系统性伪影,靠「去噪」算法救不了。
- 认为灰度图没有信息损失:灰度化是三通道到一通道的投影,颜色判断类任务必须保留彩色通道。
与其他知识点的关系
本站是全库起点:kp-002 的卷积作用在像素矩阵上;kp-004 的几何变换改变像素坐标;kp-010 的相机投影把三维点映射回这张网格;kp-028 把这些操作落成 OpenCV 代码。
自测题
- 形状为 (1080, 1920, 3) 的 uint8 数组,第 5 行第 10 列像素的蓝色分量如何索引?
答案要点:img[4, 9, 0]——注意 OpenCV 是 BGR 顺序,通道 0 是蓝,且 y 在前 x 在后。
- 为什么颜色阈值分割常用 HSV 而不是 RGB?
答案要点:HSV 中色相与明度解耦,光照强度变化主要影响 V,阈值更稳定;RGB 三通道随光照整体漂移。
- 8 位灰度图能表示多少级亮度?为什么会出现色带?
答案要点:256 级;量化级数不足时平滑渐变被迫跳变,产生可见条带。
延伸阅读
- Gonzalez 与 Woods《Digital Image Processing》第 2 章「Digital Image Fundamentals」
- Szeliski《Computer Vision: Algorithms and Applications》第 3 章「Image processing」开篇