查看全课大纲(第 5 / 93 节)
- 1.计算机视觉概述
- 2.计算机视觉应用场景
- 3.困难与挑战
- 4.开源库介绍
- 5.图像显示与存储
- 6.CLAHE
- 7.腐蚀膨胀与开闭运算
- 8.滤波与边缘填充
- 9.各种滤波
- 10.图像金字塔
- 11.傅里叶变换
- 12.短时傅里叶变换与小波变换
- 13.颜色特征与颜色直方图
- 14.几何特征_边缘
- 15.几何特征-角点与斑点
- 16.局部特征-SIFT特征描述子
- 17.局部特征-SURF特征描述子
- 18.局部特征-ORB特征描述子
- 19.其他特征描述子
- 20.传统图像分割技术
- 21.GraphCut
- 22.GrabCut
- 23.人脸检测的传统方法
- 24.行人检测的传统方法HOG+SVM
- 25.行人检测DPM
- 26.人工神经网络的架构
- 27.目标函数与梯度下降
- 28.误差反向传播
- 29.可手算的神经网络
- 30.改进目标函数与克服梯度消散
- 31.神经网络之传统神经网络与深度网络的差异
- 32.各种梯度下降算法
- 33.如何选择合适的梯度下降算法
- 34.避免过适应
- 35.CNN的架构
- 36.CNN的误差反向传播_卷积层
- 37.CNN的误差反向传播_池化层
- 38.分类所用的数据集
- 39.Alexnet详解
- 40.VGG详解
- 41.GoogLeNet_v1
- 42.BatchNormalization
- 43.GoogLeNet_v3v4
- 44.ResNet
- 45.ResNeXt
- 46.CNN设计准则
- 47.图像检索与推土机距离
- 48.基于颜色相似性
- 49.基于形状相似性
- 50.基于纹理相似性
- 51.基于局部特征相似性
- 52.DL的二值哈希编码
- 53.高维空间中检索KDTree
- 54.高维空间中检索LSH
- 55.目标识别任务综述
- 56.RCNN
- 57.SPP-Net
- 58.Fast R-CNN
- 59.Faster R-CNN
- 60.R-CNN系列模型回顾
- 61.R-FCN的设计思路
- 62.R-FCN的实现
- 63.YOLOv1
- 64.YOLOv2_9000
- 65.YOLOv3
- 66.图像分割应用场景与数据集
- 67.上采样的实现方式
- 68.FCN网络架构的由来
- 69.FCN构建细节
- 70.DeepLabv1
- 71.CRF
- 72.DeepLabv2
- 73.DeepLabv3
- 74.特定的医学影像分割任务
- 75.U-Net
- 76.3D U-Net
- 77.V-Net
- 78.DenseNet
- 79.病理切片分析任务及数据集
- 80.病理切片分析
- 81.图说任务及其传统处理方法
- 82.深度语言模型与RNN
- 83.LSTM及其变种
- 84.NIC模型
- 85.SAT模型
- 86.图说的性能指标
- 87.判别模型与生成模型
- 88.KL散度与JS散度
- 89.VAE
- 90.GAN的基本原理
- 91.DCGAN与CGAN
- 92.Wasserstein GAN
- 93.SRGAN
图像显示与存储
图像的显示与存储
小象实战讲义 · 基于深度学习的计算机视觉
在计算机视觉中,我们处理的一切对象都是数字图像。理解图像如何在计算机中被表示和存储,是后续所有图像处理、分析和深度学习任务的基础。本节将带你深入图像的本质,从人眼感知的颜色到计算机存储的矩阵,建立起连接物理世界与数字世界的桥梁。
💡 核心导读
- 颜色空间:学习 RGB、YUV、CMYK、HSV、CIE-XYZ 等主流颜色模型,理解加法混色与减法混色的物理原理。
- 离散化存储:掌握如何将连续的物理世界信息(颜色、亮度)离散化为计算机可存储的数字矩阵。
- 图像数据结构:理解一张彩色图片本质上是一个三维矩阵,以及灰度图与彩色图之间的转换关系。
- 存储格式:了解常见的图像文件格式(如 BMP、JPEG、PNG)及其背后的点阵存储与矢量存储原理。
从连续世界到离散存储
自然界中的颜色是连续的。光线照射到物体表面,反射出不同波长的光进入我们的眼睛,在视网膜上形成连续变化的色彩。然而,计算机只能处理离散的数字信息。因此,将图像存入计算机的第一步,就是将连续的颜色信息进行离散化。
这个过程主要解决两个问题:
- 颜色如何编码:用什么样的数字组合来代表一种特定的颜色?这就是颜色空间要解决的问题。
- 空间如何采样:一张图片由无数个“点”组成,我们如何选取有限数量的点来代表整张图片?这涉及到分辨率的概念。
接下来,我们将首先聚焦于第一个问题,探讨各种颜色空间。
主流颜色空间
颜色空间(Color Space)是一种通过一组数值(通常3个或4个)来精确定义颜色的数学模型。不同的颜色空间适用于不同的场景。
RGB:加法混色与显示器
RGB 是最为人熟知的颜色空间,它基于加法混色原理,专用于发光体,如显示器、电视机屏幕。
- 原理:通过混合红(Red)、绿(Green)、蓝(Blue) 三种色光来产生各种颜色。混合的光线越多,颜色越亮。当三种色光以最大强度混合时,得到白光;当三者强度均为零时,得到黑色。
- 表示:一个像素的颜色由
(R, G, B)三个独立的分量表示。每个分量的取值范围通常是[0, 255](8位整数)或[0.0, 1.0](归一化浮点数)。 - 24位真彩色:当每个通道都用8位(即一个字节)表示时,总共需要24位,可以表示 万种颜色,足以和人眼分辨的颜色数量媲美,因此被称为“真彩色”。
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标准):
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 为白。
我们可以通过特定的权重将彩色图像转换为灰度图像,这个过程称为灰度化。一个常用的转换公式是: 这个权重考虑了人眼对不同颜色亮度的敏感度差异(对绿色最敏感,蓝色最不敏感)。
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 万个像素点)。
图像文件格式
图像数据以矩阵形式存在于内存中,但为了保存和传输,需要将其序列化为文件。这就产生了各种各样的图像文件格式,主要分为两大类:
点阵图(位图):存储每个像素的颜色值。这是最常见的形式。
- BMP:Windows 位图,通常不压缩,文件体积大,保真度高。
- JPEG:采用有损压缩,通过舍弃一些人眼不敏感的细节来大幅减小文件体积,适用于网络传输和摄影照片。
- PNG:采用无损压缩,支持透明度通道,适用于需要精确显示的图形、图标等。
- GIF:采用无损压缩,支持多帧动画和256色索引颜色,适用于简单动画和图形。
矢量图:不存储像素,而是存储构成图像的几何形状(如直线、曲线、多边形)的数学描述。
- SVG, EPS, AI:放大缩小不会失真,适用于logo、图表、字体等。
- 与点阵图的区别:点阵图放大后会看到像素块(模糊),而矢量图可以无限放大保持清晰。
在深度学习的图像处理中,我们主要与点阵图格式(如 JPEG, PNG)打交道,因为我们需要直接操作像素级的数值矩阵。
📝 动手练一练
- 概念辨析:加法混色(RGB)和减法混色(CMYK)的根本物理原理是什么?请各举一个它们最适用的实际场景。
👉 点击查看参考答案
- 根本原理:
- 加法混色:是色光的混合。不同颜色的光叠加在一起,能量相加,所以越混合越亮。三原色光(红、绿、蓝)等量相加得到白光。
- 减法混色:是颜料/染料的混合。颜料通过吸收(减去)特定波长的光来呈现颜色。混合的颜料越多,被吸收的光越多,反射的光越少,因此越混合越暗。三原色颜料(青、品红、黄)等量混合理论上吸收所有光,得到黑色。
- 适用场景:
- 加法混色:所有自发光的显示设备,如电脑显示器、电视机、手机屏幕、投影仪。
- 减法混色:所有基于反射显色的领域,如彩色印刷、油漆调色、纺织印染。
- 动手计算:假设有一个像素的 RGB 值为
(R=100, G=150, B=50)。请使用公式Gray = 0.299*R + 0.587*G + 0.114*B计算其对应的灰度值(结果四舍五入取整)。
👉 点击查看参考答案
计算过程: 因此,该像素对应的灰度值约为 124。
本章小结
本节我们深入探讨了数字图像的基石——显示与存储。我们了解到,计算机通过颜色空间(如 RGB、HSV)将连续的颜色世界编码为离散的数字,并以矩阵的形式(二维灰度图或三维彩色图)在内存中表示。分辨率决定了图像细节的丰富度,而不同的文件格式(如 JPEG、PNG)则在存储效率与图像保真度之间做出权衡。理解这些基本原理,是后续进行图像处理、特征提取和深度学习模型设计的必备前提。
📋 行动清单
- 在脑海中建立“彩色图像 = 三个通道矩阵叠加”的清晰概念。
- 理解 RGB(加法)与 CMYK(减法)混色的核心区别及其应用场景。
- 用 numpy 构造一张 2x2 的 BGR 小图,再用 OpenCV 的
cvtColor在 BGR 与 HSV 之间转换,观察数值变化。
—— 小象教研组
配套资料 · 直接下载
课件、代码、数据集等配套资料全部免费,点击即可直接下载,无需分享或解锁。