原始图像
接口类型:
压缩图像
接口类型:
sensor_msgs/msg/CompressedImage
ros2 interface show sensor_msgs/msg/CompressedImage
# This message contains a compressed image.
std_msgs/Header header # Header timestamp should be acquisition time of image
builtin_interfaces/Time stamp
int32 sec
uint32 nanosec
string frame_id
# Header frame_id should be optical frame of camera
# origin of frame should be optical center of cameara
# +x should point to the right in the image
# +y should point down in the image
# +z should point into to plane of the image
string format # Specifies the format of the data
# Acceptable values:
# jpeg, png, tiff
uint8[] data # Compressed image buffer
1. header
(std_msgs/Header
)
消息的头部信息,包含时间戳和坐标系标识:
-
stamp
(builtin_interfaces/Time
)-
sec
(int32
): 时间戳的秒部分 -
nanosec
(uint32
): 时间戳的纳秒部分 -
作用:表示图像的采集时间(通常是相机捕获图像的时刻)。
-
-
frame_id
(string
)-
作用:定义图像的坐标系(通常是相机的光学坐标系)。
-
坐标系约定:
-
原点:相机的光学中心(光心)。
-
+x
:指向图像的右侧。 -
+y
:指向图像的下方。 -
+z
:指向图像平面内(即光轴方向)。
-
-
2. format
(string
)
指定图像的压缩格式,常见值包括:
-
"jpeg"
、"png"
、"tiff"
(ROS 支持的压缩格式)。 -
作用:告知解码器如何解析后续的
data
字段。
3. data
(uint8[]
)
存储压缩后的图像数据的字节数组:
-
编码方式:由
format
字段指定(如 JPEG、PNG 等)。 -
特点:
-
二进制数据,直接存储压缩后的字节流。
-
相比原始图像(
sensor_msgs/Image
),体积更小,适合带宽有限的场景。
-
关键区别:CompressedImage
vs 原始 Image
-
原始图像 (
sensor_msgs/Image
):-
包含未压缩的像素数据(如
rgb8
、bgr8
、mono8
等格式)。 -
数据量大,占用带宽高。
-
-
压缩图像 (
CompressedImage
):-
通过
format
指定压缩算法(如 JPEG/PNG),data
存储压缩后的二进制流。 -
需解码后才能使用(如用 OpenCV 的
cv_bridge
)。
-
图像压缩算法和像素格式
图像的本质
图像的数据本质上是 像素值的集合,存储了每个点的颜色或亮度信息。
-
在内存中的表示:
-
图像是一个多维数组(如OpenCV中的
ndarray
)。 -
例如:
-
灰度图:
shape=(H, W)
,每个像素是0
(黑)到255
(白)的整数(uint8
)。 -
彩色图:
shape=(H, W, 3)
,每个像素是[B, G, R]
三个通道的值(OpenCV默认顺序)。
-
-
-
在文件中的表示:
-
未压缩格式(如BMP):直接存储像素值,文件较大。
-
压缩格式(如JPEG/PNG):通过算法减少存储空间。
-
-- 所以先有像素,再有图像压缩算法。
图像压缩算法
作用
主要用于减少图像数据的体积,分为无损压缩和有损压缩。
分类
(1) 无损压缩
压缩后可以完全恢复原始数据,适合需要精确像素的场景(如医学影像、卫星图像)。
-
PNG (Portable Network Graphics)
-
支持透明通道(Alpha通道),适合保存带遮罩的图像。
-
压缩率较高,但比JPEG慢。
-
-
TIFF (Tagged Image File Format)
-
支持多图层、多通道,常用于专业摄影和印刷。
-
-
BMP (位图)
-
无压缩,文件体积大,ROS中较少使用。
-
(2) 有损压缩
牺牲部分图像质量以换取更高的压缩率,适合实时传输(如摄像头数据)。
-
JPEG (Joint Photographic Experts Group)
-
最常用的有损压缩格式,适用于自然场景(照片)。
-
不支持透明通道,压缩率高,但可能产生块状伪影(Blocking Artifacts)。
-
-
WebP
-
Google开发,比JPEG更高的压缩率,支持透明通道。
-
-
HEIF/HEIC
-
苹果推广的高效图像格式,压缩率优于JPEG。
-
像素格式(Pixel Formats)
本质和作用
像素格式定义了图像数据的存储方式和解释规则。
注意:计算机中任何数据都是01二进制,所以图像数据也是01二进制数据。
像素格式由很多标准组成:
-
颜色通道(Channels)
决定图像的色彩信息如何存储,是像素格式最关键的组成部分。
-
常见类型:
通道数量 | 格式示例 | 说明 |
1 | mono8 | 单通道灰度图(0=黑,255=白) |
3 | bgr8/rgb8 | 三通道彩色图(BGR是OpenCV默认顺序,RGB是通用标准) |
4 | bgra8 | 四通道(含Alpha透明通道,0=透明,255=不透明) |
其他 | yuv422 | 多通道非RGB格式(如YUV用于视频压缩) |
-
特殊通道排列:
-
Bayer格式(如
bayer_rggb
):原始相机传感器的单通道排列,需解马赛克(Demosaicing)转换为RGB。
-
-
位深度(Bit Depth)
定义每个通道的数值范围和精度,影响图像的动态范围和存储大小。
位深度 | 数据类型 | 数值范围 | 典型用途 |
8位 | uint8 | 0~255 | 普通图像(JPEG/PNG) |
16位 | uint16 | 0~65535 | 医学影像、深度传感器 |
32位 | float32 | 浮点数(如0.0~1.0) | 高动态范围(HDR)、深度图 |
示例:
-
mono16
:16位灰度图,可表示更精细的亮度层次。 -
32FC1
:32位浮点单通道,用于存储深度值(单位:米)。
-
数据布局(Memory Layout)
定义像素值在内存中的排列方式,影响数据读取效率。
-
交错存储(Interleaved):
-
通道值按像素顺序排列(如BGRBGRBGR...)。
-
适用于大多数彩色图像(如OpenCV的
bgr8
)。
-
-
平面存储(Planar):
-
所有像素的同一通道连续存储(如RRRR...GGGG...BBBB...)。
-
常见于视频编码(如YUV420)。
-
示例对比:
-
bgr8
(Interleaved):[B1,G1,R1, B2,G2,R2, ...]
-
yuv420
(Planar):[Y1,Y2,...,Yn, U1,U2..., V1,V2...]
-
颜色空间(Color Space)
定义如何将数值映射到实际颜色,影响色彩还原效果。
颜色空间 | 说明 |
RGB/BGR | 基于红、绿、蓝三原色的加色模型,最常用。 |
YUV/YCrCb | 分离亮度(Y)和色度(UV),用于视频压缩(如JPEG、H.264)。 |
HSV/HSL | 用色调(H)、饱和度(S)、亮度(V/L)表示,适合颜色分析。 |
Grayscale | 单通道亮度值,无色彩信息。 |
示例:
-
摄像头原始数据可能是
YUV422
,需转换为BGR
才能在OpenCV中正确显示。
分类
(1) 常见彩色格式
格式名 | 说明 |
rgb8 | 红-绿-蓝,每个通道8位(24位色) |
bgr8 | 蓝-绿-红(OpenCV默认格式) |
rgba8 | 红-绿-蓝-透明(32位) |
bgra8 | 蓝-绿-红-透明(OpenCV带Alpha通道) |
yuv422 | YUV颜色空间,用于部分摄像头 |
yuv420 | 更紧凑的YUV格式(视频常用) |
(2) 灰度(单通道)格式
格式名 | 说明 |
mono8 | 8位灰度图(0=黑,255=白) |
mono16 | 16位灰度图(0~65535) |