图像的数字化表示与色彩空间

入门01-图像与基础处理预计 20 分钟图像表示色彩空间数字化像素

一句话定义

图像在计算机中是按行列采样、量化为有限整数或浮点值的像素矩阵,一个或多个通道(灰度、RGB、HSV 等)共同构成它的数字表示。

为什么重要

所有视觉算法的第一输入都是这个矩阵:理解分辨率、位深、通道与坐标约定,是读懂任何后续处理(滤波、投影、卷积)的前提;工程事故里相当一部分来自对通道顺序、数据类型、坐标轴方向的误解,而不是算法本身。

直观类比

把图像想象成一张超大城市网格地图:每个交叉路口(像素)记录了几个数字(通道值),整张地图就是矩阵;相机成像相当于把连续的光场压扁、采样成这份离散档案,压扁和采样的方式决定了你后面能看到什么。

前置知识

本库知识点 kp-001 为入口站,无前置知识点;建议先具备库外的 NumPy 数组基本操作。

核心概念

原理与机制

数字图像由「采样」与「量化」两步形成:连续光场先被传感器以固定间隔采样成网格(采样率对应分辨率),再把每个采样点的连续亮度映射到有限整数(量化对应位深)。采样不足产生马赛克与锯齿,量化不足产生色带。灰度化并非简单平均,而是按人眼对绿色最敏感的特性加权。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 把颜色判断从三个耦合变量拆成独立旋钮」。

图示

离散像素网格(采样 + 量化) R 通道 G 通道 B 通道 三通道叠加 合成彩色 图像

实例与案例

一张 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

常见误区

与其他知识点的关系

本站是全库起点:kp-002 的卷积作用在像素矩阵上;kp-004 的几何变换改变像素坐标;kp-010 的相机投影把三维点映射回这张网格;kp-028 把这些操作落成 OpenCV 代码。

自测题

  1. 形状为 (1080, 1920, 3) 的 uint8 数组,第 5 行第 10 列像素的蓝色分量如何索引?

答案要点:img[4, 9, 0]——注意 OpenCV 是 BGR 顺序,通道 0 是蓝,且 y 在前 x 在后。

  1. 为什么颜色阈值分割常用 HSV 而不是 RGB?

答案要点:HSV 中色相与明度解耦,光照强度变化主要影响 V,阈值更稳定;RGB 三通道随光照整体漂移。

  1. 8 位灰度图能表示多少级亮度?为什么会出现色带?

答案要点:256 级;量化级数不足时平滑渐变被迫跳变,产生可见条带。

延伸阅读

相关知识点

kp-010 针孔相机模型与投影kp-028 工具链与 OpenCV 实战