查看全课大纲(第 5 / 93 节)
  1. 1.计算机视觉概述
  2. 2.计算机视觉应用场景
  3. 3.困难与挑战
  4. 4.开源库介绍
  5. 5.图像显示与存储
  6. 6.CLAHE
  7. 7.腐蚀膨胀与开闭运算
  8. 8.滤波与边缘填充
  9. 9.各种滤波
  10. 10.图像金字塔
  11. 11.傅里叶变换
  12. 12.短时傅里叶变换与小波变换
  13. 13.颜色特征与颜色直方图
  14. 14.几何特征_边缘
  15. 15.几何特征-角点与斑点
  16. 16.局部特征-SIFT特征描述子
  17. 17.局部特征-SURF特征描述子
  18. 18.局部特征-ORB特征描述子
  19. 19.其他特征描述子
  20. 20.传统图像分割技术
  21. 21.GraphCut
  22. 22.GrabCut
  23. 23.人脸检测的传统方法
  24. 24.行人检测的传统方法HOG+SVM
  25. 25.行人检测DPM
  26. 26.人工神经网络的架构
  27. 27.目标函数与梯度下降
  28. 28.误差反向传播
  29. 29.可手算的神经网络
  30. 30.改进目标函数与克服梯度消散
  31. 31.神经网络之传统神经网络与深度网络的差异
  32. 32.各种梯度下降算法
  33. 33.如何选择合适的梯度下降算法
  34. 34.避免过适应
  35. 35.CNN的架构
  36. 36.CNN的误差反向传播_卷积层
  37. 37.CNN的误差反向传播_池化层
  38. 38.分类所用的数据集
  39. 39.Alexnet详解
  40. 40.VGG详解
  41. 41.GoogLeNet_v1
  42. 42.BatchNormalization
  43. 43.GoogLeNet_v3v4
  44. 44.ResNet
  45. 45.ResNeXt
  46. 46.CNN设计准则
  47. 47.图像检索与推土机距离
  48. 48.基于颜色相似性
  49. 49.基于形状相似性
  50. 50.基于纹理相似性
  51. 51.基于局部特征相似性
  52. 52.DL的二值哈希编码
  53. 53.高维空间中检索KDTree
  54. 54.高维空间中检索LSH
  55. 55.目标识别任务综述
  56. 56.RCNN
  57. 57.SPP-Net
  58. 58.Fast R-CNN
  59. 59.Faster R-CNN
  60. 60.R-CNN系列模型回顾
  61. 61.R-FCN的设计思路
  62. 62.R-FCN的实现
  63. 63.YOLOv1
  64. 64.YOLOv2_9000
  65. 65.YOLOv3
  66. 66.图像分割应用场景与数据集
  67. 67.上采样的实现方式
  68. 68.FCN网络架构的由来
  69. 69.FCN构建细节
  70. 70.DeepLabv1
  71. 71.CRF
  72. 72.DeepLabv2
  73. 73.DeepLabv3
  74. 74.特定的医学影像分割任务
  75. 75.U-Net
  76. 76.3D U-Net
  77. 77.V-Net
  78. 78.DenseNet
  79. 79.病理切片分析任务及数据集
  80. 80.病理切片分析
  81. 81.图说任务及其传统处理方法
  82. 82.深度语言模型与RNN
  83. 83.LSTM及其变种
  84. 84.NIC模型
  85. 85.SAT模型
  86. 86.图说的性能指标
  87. 87.判别模型与生成模型
  88. 88.KL散度与JS散度
  89. 89.VAE
  90. 90.GAN的基本原理
  91. 91.DCGAN与CGAN
  92. 92.Wasserstein GAN
  93. 93.SRGAN

图像显示与存储

图像的显示与存储

小象实战讲义 · 基于深度学习的计算机视觉

在计算机视觉中,我们处理的一切对象都是数字图像。理解图像如何在计算机中被表示和存储,是后续所有图像处理、分析和深度学习任务的基础。本节将带你深入图像的本质,从人眼感知的颜色到计算机存储的矩阵,建立起连接物理世界与数字世界的桥梁。

💡 核心导读

  • 颜色空间:学习 RGB、YUV、CMYK、HSV、CIE-XYZ 等主流颜色模型,理解加法混色与减法混色的物理原理。
  • 离散化存储:掌握如何将连续的物理世界信息(颜色、亮度)离散化为计算机可存储的数字矩阵。
  • 图像数据结构:理解一张彩色图片本质上是一个三维矩阵,以及灰度图与彩色图之间的转换关系。
  • 存储格式:了解常见的图像文件格式(如 BMP、JPEG、PNG)及其背后的点阵存储与矢量存储原理。

从连续世界到离散存储

自然界中的颜色是连续的。光线照射到物体表面,反射出不同波长的光进入我们的眼睛,在视网膜上形成连续变化的色彩。然而,计算机只能处理离散的数字信息。因此,将图像存入计算机的第一步,就是将连续的颜色信息进行离散化。

这个过程主要解决两个问题:

  1. 颜色如何编码:用什么样的数字组合来代表一种特定的颜色?这就是颜色空间要解决的问题。
  2. 空间如何采样:一张图片由无数个“点”组成,我们如何选取有限数量的点来代表整张图片?这涉及到分辨率的概念。

接下来,我们将首先聚焦于第一个问题,探讨各种颜色空间。

主流颜色空间

颜色空间(Color Space)是一种通过一组数值(通常3个或4个)来精确定义颜色的数学模型。不同的颜色空间适用于不同的场景。

RGB:加法混色与显示器

RGB 是最为人熟知的颜色空间,它基于加法混色原理,专用于发光体,如显示器、电视机屏幕。

  • 原理:通过混合红(Red)、绿(Green)、蓝(Blue) 三种色光来产生各种颜色。混合的光线越多,颜色越亮。当三种色光以最大强度混合时,得到白光;当三者强度均为零时,得到黑色。
  • 表示:一个像素的颜色由 (R, G, B) 三个独立的分量表示。每个分量的取值范围通常是 [0, 255](8位整数)或 [0.0, 1.0](归一化浮点数)。
  • 24位真彩色:当每个通道都用8位(即一个字节)表示时,总共需要24位,可以表示 224≈16772^{24} \approx 1677 万种颜色,足以和人眼分辨的颜色数量媲美,因此被称为“真彩色”。
import numpy as np

# 演示RGB颜色的加法混色:通过叠加三个通道的矩阵来模拟
# 创建一个简单的3x3像素图像区域
red_channel = np.array([[255, 0, 0],
                        [255, 0, 0],
                        [255, 0, 0]], dtype=np.uint8)

green_channel = np.array([[0, 255, 0],
                          [0, 255, 0],
                          [0, 255, 0]], dtype=np.uint8)

blue_channel = np.array([[0, 0, 255],
                         [0, 0, 255],
                         [0, 0, 255]], dtype=np.uint8)

# 在计算机中,这三个通道的数据是分开存储的。
# 我们可以将它们堆叠成一个3D矩阵(高度,宽度,通道)。
# 注意:OpenCV默认使用BGR顺序,这里我们按RGB顺序创建,但在显示或处理时需要注意顺序。
rgb_image = np.stack([red_channel, green_channel, blue_channel], axis=-1)
print("RGB图像的形状(高度,宽度,通道):", rgb_image.shape)
print("第一个像素的(R, G, B)值:", rgb_image[0, 0, :])
RGB图像的形状(高度,宽度,通道): (3, 3, 3)
第一个像素的(R, G, B)值: [255   0   0]

YUV:兼容历史的亮度与色度分离

YUV 颜色空间(数字视频中常用的缩放版本称为 YCbCr)在欧洲电视系统中被广泛采用。它的出现主要是为了解决早期彩色电视机与黑白电视机的兼容问题。

  • 原理:将颜色信息分离为亮度(Y,Luma) 和色度(U/V,Chroma)。
    • Y:表示图像的明亮度(灰度信息)。
    • U 和 V:表示图像的色度和饱和度,即具体的颜色信息。
  • 兼容性:黑白电视机只需要处理 Y 分量就能显示图像,而彩色电视机则同时处理 Y、U、V 三个分量。这样,同一套信号可以同时服务两种设备。
  • 转换:YUV 可以从 RGB 通过线性变换得到,常见的转换公式如下(ITU-R BT.601标准): Y=0.299R+0.587G+0.114BY = 0.299R + 0.587G + 0.114B U=−0.147R−0.289G+0.436BU = -0.147R - 0.289G + 0.436B V=0.615R−0.515G−0.100BV = 0.615R - 0.515G - 0.100B

CMYK:减法混色与印刷

与 RGB 的加法混色相反,CMYK 颜色空间基于减法混色原理,主要用于印刷、绘画等反射场景。

  • 原理:通过混合青(Cyan)、品红(Magenta)、黄(Yellow) 三种颜料来吸收(减去)特定波长的光,从而呈现颜色。颜料混合越多,吸收的光越多,颜色越暗。理论上,CMY三者等量混合得到黑色,但实际印刷中会加入单独的黑(Key) 色版来提高黑色纯度和节省彩色油墨。
  • 表示:一个像素的颜色由 (C, M, Y, K) 四个分量表示,取值范围通常也是 [0, 255] 或 [0.0, 1.0]。

HSV:符合人类直觉的颜色描述

HSV 颜色空间从人类视觉感知的角度出发,被广泛应用于图像分析、颜色选取等场景。

  • 原理:用三个更符合人类描述习惯的要素来定义颜色:
    • H(Hue,色调):指颜色的种类,如红、黄、蓝。通常用一个角度(0°-360°)或对应数值表示。
    • S(Saturation,饱和度):指颜色的纯度或鲜艳程度。饱和度越高,颜色越纯(越少白色掺杂);饱和度为零时,颜色变为灰度。
    • V(Value,明度):指颜色的明亮程度。明度越高,颜色越亮;明度为零时,颜色为黑色。
  • 直观性:HSV 模型非常直观。例如,调整饱和度可以让颜色更鲜艳或更淡雅,调整明度可以控制颜色的亮暗,而不改变其基本的色调。
import cv2
import numpy as np

# 创建一个纯绿色的BGR像素(OpenCV使用BGR顺序)
green_bgr = np.uint8([[[0, 255, 0]]])
# 将其转换为HSV颜色空间
green_hsv = cv2.cvtColor(green_bgr, cv2.COLOR_BGR2HSV)
print("纯绿色BGR值 [B, G, R]:", green_bgr[0,0])
print("对应的HSV值 [H, S, V]:", green_hsv[0,0])
print("注意:OpenCV中H的范围是[0, 179],S和V的范围是[0, 255]。")
纯绿色BGR值 [B, G, R]: [  0 255   0]
对应的HSV值 [H, S, V]: [ 60 255 255]
注意:OpenCV中H的范围是[0, 179],S和V的范围是[0, 255]。

CIE-XYZ:颜色科学的基础

CIE-XYZ 颜色空间由国际照明委员会(CIE)于1931年创立,它是几乎所有其他颜色空间的理论基础和参考标准。

  • 原理:基于大量人类视觉实验数据,直接模拟人眼对颜色的感知。它定义了三个假想的原色 X、Y、Z,其中 Y 分量直接代表亮度。
  • 重要性:CIE-XYZ 色域覆盖了人眼可见的所有颜色。我们常用的 RGB 等颜色空间,都可以看作是 CIE-XYZ 空间的一个子集。它确保了不同设备间颜色转换的科学性和一致性。

图像在计算机中的存储原理

了解了颜色编码,我们来看图像的整体存储。一张数字图像,无论是彩色还是灰度,在计算机内存中最基本的表示形式就是一个数值矩阵。

彩色图像:三维矩阵

一张 RGB 彩色图像,可以看作是由红、绿、蓝三个通道的灰度图像叠加而成。因此,它在计算机中被存储为一个三维矩阵,维度为 (高度, 宽度, 通道数)。对于 RGB 图像,通道数为 3。

import numpy as np

# 模拟一张2x2像素的RGB图像数据
# 构造一个形状为 (2, 2, 3) 的矩阵
# 每个像素点是一个包含3个值(R, G, B)的列表
image_data = np.array([
    [[255, 0, 0],   # 左上角像素:红色 (R=255, G=0, B=0)
     [0, 255, 0]],  # 右上角像素:绿色
    [[0, 0, 255],   # 左下角像素:蓝色
     [255, 255, 255]] # 右下角像素:白色
], dtype=np.uint8)

print("图像矩阵形状:", image_data.shape)
print("图像数据:")
print(image_data)
print("\n访问左上角像素的红色通道值:", image_data[0, 0, 0])
print("访问整个绿色通道(G通道索引为1):")
print(image_data[:, :, 1])
图像矩阵形状: (2, 2, 3)
图像数据:
[[[255   0   0]
  [  0 255   0]]

 [[  0   0 255]
  [255 255 255]]]

访问左上角像素的红色通道值: 255
访问整个绿色通道(G通道索引为1):
[[  0 255]
 [  0 255]]

灰度图像:二维矩阵与灰度化

灰度图像只包含亮度信息,没有颜色信息。因此,它被存储为一个二维矩阵,维度为 (高度, 宽度)。每个像素值代表该点的亮度(灰度级),通常范围也是 [0, 255],0 为黑,255 为白。

我们可以通过特定的权重将彩色图像转换为灰度图像,这个过程称为灰度化。一个常用的转换公式是: Gray=0.299×R+0.587×G+0.114×BGray = 0.299 \times R + 0.587 \times G + 0.114 \times B 这个权重考虑了人眼对不同颜色亮度的敏感度差异(对绿色最敏感,蓝色最不敏感)。

import numpy as np

# 复用上面的2x2图像数据。注意:这里按 OpenCV 的 BGR 顺序存放,
# 因此通道索引 2 是 R,索引 1 是 G,索引 0 是 B。
# 同一组数值换一种通道顺序解读,颜色含义就会反转——这正是图像处理里最容易踩的坑。
bgr_image = np.array([
    [[255, 0, 0],
     [0, 255, 0]],
    [[0, 0, 255],
     [255, 255, 255]]
], dtype=np.float32) # 转换为浮点以进行加权计算

# 手动灰度化公式(按 BGR 索引取通道)
gray_manual = 0.299 * bgr_image[:, :, 2] + 0.587 * bgr_image[:, :, 1] + 0.114 * bgr_image[:, :, 0]
print("手动计算灰度图:")
print(gray_manual.astype(np.uint8))

# 注意:灰度化是单向的。从灰度图无法恢复原始的彩色信息。
手动计算灰度图:
[[ 29 149]
 [ 76 255]]

分辨率与离散化采样

除了颜色,将连续世界离散化的另一个关键因素是分辨率。分辨率决定了在单位面积内用多少个像素点来记录图像信息。分辨率越高,像素点越多,图像细节越丰富,存储所需的数据量也越大。摄像设备(如手机摄像头)的像素数,指的就是其能捕获的最大分辨率(例如 1200 万像素意味着图像矩阵有大约 1200 万个像素点)。

图像文件格式

图像数据以矩阵形式存在于内存中,但为了保存和传输,需要将其序列化为文件。这就产生了各种各样的图像文件格式,主要分为两大类:

  1. 点阵图(位图):存储每个像素的颜色值。这是最常见的形式。

    • BMP:Windows 位图,通常不压缩,文件体积大,保真度高。
    • JPEG:采用有损压缩,通过舍弃一些人眼不敏感的细节来大幅减小文件体积,适用于网络传输和摄影照片。
    • PNG:采用无损压缩,支持透明度通道,适用于需要精确显示的图形、图标等。
    • GIF:采用无损压缩,支持多帧动画和256色索引颜色,适用于简单动画和图形。
  2. 矢量图:不存储像素,而是存储构成图像的几何形状(如直线、曲线、多边形)的数学描述。

    • SVG, EPS, AI:放大缩小不会失真,适用于logo、图表、字体等。
    • 与点阵图的区别:点阵图放大后会看到像素块(模糊),而矢量图可以无限放大保持清晰。

在深度学习的图像处理中,我们主要与点阵图格式(如 JPEG, PNG)打交道,因为我们需要直接操作像素级的数值矩阵。

📝 动手练一练

  1. 概念辨析:加法混色(RGB)和减法混色(CMYK)的根本物理原理是什么?请各举一个它们最适用的实际场景。
👉 点击查看参考答案
  • 根本原理:
    • 加法混色:是色光的混合。不同颜色的光叠加在一起,能量相加,所以越混合越亮。三原色光(红、绿、蓝)等量相加得到白光。
    • 减法混色:是颜料/染料的混合。颜料通过吸收(减去)特定波长的光来呈现颜色。混合的颜料越多,被吸收的光越多,反射的光越少,因此越混合越暗。三原色颜料(青、品红、黄)等量混合理论上吸收所有光,得到黑色。
  • 适用场景:
    • 加法混色:所有自发光的显示设备,如电脑显示器、电视机、手机屏幕、投影仪。
    • 减法混色:所有基于反射显色的领域,如彩色印刷、油漆调色、纺织印染。
  1. 动手计算:假设有一个像素的 RGB 值为 (R=100, G=150, B=50)。请使用公式 Gray = 0.299*R + 0.587*G + 0.114*B 计算其对应的灰度值(结果四舍五入取整)。
👉 点击查看参考答案

计算过程: Gray=0.299×100+0.587×150+0.114×50=29.9+88.05+5.7=123.65≈124(四舍五入取整)\begin{aligned} Gray &= 0.299 \times 100 + 0.587 \times 150 + 0.114 \times 50 \\ &= 29.9 + 88.05 + 5.7 \\ &= 123.65 \\ &\approx 124 \quad (\text{四舍五入取整}) \end{aligned} 因此,该像素对应的灰度值约为 124。

本章小结

本节我们深入探讨了数字图像的基石——显示与存储。我们了解到,计算机通过颜色空间(如 RGB、HSV)将连续的颜色世界编码为离散的数字,并以矩阵的形式(二维灰度图或三维彩色图)在内存中表示。分辨率决定了图像细节的丰富度,而不同的文件格式(如 JPEG、PNG)则在存储效率与图像保真度之间做出权衡。理解这些基本原理,是后续进行图像处理、特征提取和深度学习模型设计的必备前提。

📋 行动清单

  • 在脑海中建立“彩色图像 = 三个通道矩阵叠加”的清晰概念。
  • 理解 RGB(加法)与 CMYK(减法)混色的核心区别及其应用场景。
  • 用 numpy 构造一张 2x2 的 BGR 小图,再用 OpenCV 的 cvtColor 在 BGR 与 HSV 之间转换,观察数值变化。

—— 小象教研组

配套资料 · 直接下载

课件、代码、数据集等配套资料全部免费,点击即可直接下载,无需分享或解锁。

  • 第2章《图像预处理》配套课件(PDF)
    PDF · 4.2MB · 原课教辅
    下载
  • 第2章《图像预处理》配套代码包
    ZIP · 0.6MB · 原课教辅
    下载