当前位置: 首页 > news >正文

ros2--图像/image

原始图像

接口类型:

压缩图像

接口类型:

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 imagebuiltin_interfaces/Time stampint32 secuint32 nanosecstring 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 imagestring format                # Specifies the format of the data#   Acceptable values:#     jpeg, png, tiffuint8[] 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)

    • 包含未压缩的像素数据(如 rgb8bgr8mono8 等格式)。

    • 数据量大,占用带宽高。

  • 压缩图像 (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二进制数据。

像素格式由很多标准组成:

  1. 颜色通道(Channels)

决定图像的色彩信息如何存储,是像素格式最关键的组成部分。

  • 常见类型

通道数量格式示例说明
1mono8单通道灰度图(0=黑,255=白)
3bgr8/rgb8三通道彩色图(BGR是OpenCV默认顺序,RGB是通用标准)
4bgra8四通道(含Alpha透明通道,0=透明,255=不透明)
其他yuv422多通道非RGB格式(如YUV用于视频压缩)
  • 特殊通道排列

    • Bayer格式(如bayer_rggb):原始相机传感器的单通道排列,需解马赛克(Demosaicing)转换为RGB。


  1. 位深度(Bit Depth)

定义每个通道的数值范围和精度,影响图像的动态范围和存储大小。

位深度数据类型数值范围典型用途
8位uint80~255普通图像(JPEG/PNG)
16位uint160~65535医学影像、深度传感器
32位float32浮点数(如0.0~1.0)高动态范围(HDR)、深度图

示例

  • mono16:16位灰度图,可表示更精细的亮度层次。

  • 32FC1:32位浮点单通道,用于存储深度值(单位:米)。


  1. 数据布局(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...]


  1. 颜色空间(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通道)
yuv422YUV颜色空间,用于部分摄像头
yuv420更紧凑的YUV格式(视频常用)

(2) 灰度(单通道)格式

格式名说明
mono88位灰度图(0=黑,255=白)
mono1616位灰度图(0~65535)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.dtcms.com/a/232997.html

相关文章:

  • YOLO在C#中的完整训练、验证与部署方案
  • 数据分析后台设计指南:实战案例解析与5大设计要点总结
  • Java开发中复用公共SQL的方法
  • 测试W5500的第11步_使用ARP解析IP地址对应的MAC地址
  • Postgresql字符串操作函数
  • 【笔记】解决MSYS2安装后cargo-install-update.exe-System Error
  • 如果科技足够发达,是否还需要维持自然系统(例如生物多样性)中那种‘冗余’和‘多样性’,还是可以只保留最优解?
  • Android Settings 数据库生成、监听与默认值配置
  • Mysql锁及其分类
  • Linux下JSON序列化与反序列化方法
  • buuctf——web刷题第二页
  • 深入解析CI/CD开发流程
  • Elasticsearch最新入门教程
  • 【C++进阶篇】C++11新特性(中篇)
  • 【Python3教程】Python3基础篇之错误和异常
  • 【汇编逆向系列】六、函数调用包含多个参数之多个整型-参数压栈顺序,rcx,rdx,r8,r9寄存器
  • Go语言底层(三): sync 锁 与 对象池
  • 华为云CentOS配置在线yum源,连接公网后,逐步复制粘贴,看好自己对应的版本即可,【新手必看】
  • 【Zephyr 系列 9】Zephyr 与设备树机制详解:如何为你的板子编写 Devicetree
  • Linux系统编程-DAY10(TCP操作)
  • java32
  • python变量
  • 【Go语言基础】基本语法
  • Linux(12)——基础IO(下)
  • 优化学习笔记
  • Unity协程Coroutine与UniTask对比
  • TIA博途中的程序导出为PDF格式的具体方法示例
  • 2025年牛客网秋招/社招高质量 Java 面试八股文整理
  • Linux免杀方案汇总(C语言)
  • 力扣100题之128. 最长连续序列