摄像头工程师说 Camera - 数据格式 RAW、RGB(1)

news2024/11/16 12:41:09

Camera - 数据格式 RAW、RGB

  • Camera 数据格式-RAW、RGB
    • 从摄像头工作的基本原理说起
    • 回归本质-图像色彩的几种表示方法
      • RGB 三原色
      • RAW RGB 格式诞生
      • RAW8 VS RAW10
      • 真彩色-RGB888、BGR888 格式的引入
      • 数据量小点的 RGB 格式-RGB565、RGB555
      • 用位数表示的 RGB 格式
        • RGB24:
        • RGB32
        • RGB4、RGB16
      • 当3D效果、或者阴影变得重要-RGBA
    • 总结

Camera 数据格式-RAW、RGB

概述:
本文主要讲述与 Camera 输出数据格式相关的基础知识,通过本文,你可以了解关于相机项目中摄像头输出格式的选择与原理。

从摄像头工作的基本原理说起

摄像头是一个包含感光芯片的光学器件。如下所示是一个典型的摄像头元器件的组成。其整体结构类似一个凸透镜成像原理。当相机的快门按下时,光线经过镜头组、滤光片,将收集到的光线照射在 CMOS 感光芯片的的感光矩阵上,感光芯片记录此时的光照情况。
在这里插入图片描述

摄像头组成(图片来自网络wiki)

感光芯片中有一些列感光元器件。每个感光元器件可以简称为一个像素点。它主要的作用是在相机快门按下的那一刻对视野内的光线进行采样,然后对采样的光线进行量化,形成一个量化值。 下图的每一个小方格都是一个感光芯片中的像素点,这些像素点集合在一起就可以对一片区域的光照情况进行采样,进而记录该片视野内的图像,照片就被记录下来了。

在这里插入图片描述

回归本质-图像色彩的几种表示方法

RGB 三原色

物理老师告诉我们。自然界的颜色都可以通过红色、绿色、蓝色,即 Red、Green、Blue 三原色组合得到:

在这里插入图片描述

三原色(图片来自网络wiki)

因此,只要我们采集的光线记录了视野范围内的 R\G\B 值,就可以还原该像素点对应的实际物体的颜色。

如何记录每个像素点的 RGB 值?

RAW RGB 格式诞生

这需要用到上述相机组成中的一个元器件-滤光片。物理老师告诉我们,指定颜色的透镜只能通过与其颜色相同的。比如,红色透镜只能透过红色光:
在这里插入图片描述

(红色透镜只能通过红色光线-图片来自网络wiki)

因此,每个像素点前面都放置了不同颜色的滤光片。即图示的每个像素点只能通过一种颜色,如坐标(0,0)的像素点只能记录红色、坐标(0,1)的像素点只能记录绿色:

在这里插入图片描述
为了恢复坐标(0,0)处实际的颜色,其需要 R\G\B 三个值,但是坐标(0,0)处只有红色滤光片,只能得到此处的红色数据。怎么办?
因此在生成该像素点的颜色值时其需要借用坐标(0,1)的像素点的绿色、借用坐标(1,1)处的蓝色,这样就组合成了R、G、B 三个值(不用担心啦,这种借用是经过考证的,恢复该点的颜色虽然有小小的误差,但完全没问题的)。

这里我们就引出了第一种数据格式的定义-RAW RGB。RAW RGB 是指经过上述滤光片过滤后形成的采样数据,即每个像素点只输出一种颜色对应的值,这种原始的R\G\B 数据称为 RAW RGB 格式。此时每个像素点对应的 RAW RGB 值为:

  • 坐标(0,0): R00(后缀为横纵坐标)
  • 坐标(0,1): G01
  • 坐标(1,1): B11

RAW8 VS RAW10

如果上述 R00 用 8bit 的数值来表示,就是 RAW8。类似的,如果上述 R00 用 10bit 的数值来表示,就是 RAW10.
对于 8bit 数据的取值范围,也有不同的标准。

  • 如果是 0~255,就是 full range 标准。
  • 如果是 16 ~240,就是 limited range 标准。

真彩色-RGB888、BGR888 格式的引入

在这样的原始数据 RAW-RGB 生成后,摄像头可以通过软件或者硬件对其进行组合,还原该像素点的颜色。典型的采样是每个R、G或B 值用 8bit 的数据进行表示。这就引出了 RGB888 格式,即每个像素点的输出其对应的三原色的值(借用其他像素点的颜色喽)此时坐标(0,0)像素点对应的值为:

  • 像素坐标(0,0)处用的 R\G\B 值为: R00+G01+B11
    当然,你可以改变R\G\B 数据的排列顺序,比如: B11+G01+R00,这样就变成了 BGR888 格式的数据。
    一些专业工具可以从图像中提取R、G、B三个分量的值:
    在这里插入图片描述

(从图像中分离R、G、B-图片来自网络wiki)

数据量小点的 RGB 格式-RGB565、RGB555

在 RGB888 格式下,一个像素对应的数据大小是 8bit +8bit + 8bit,其可以形成 2^8*3 种颜色。尽管色彩更加无损,但数据量太大了。
允许一点误差,来减小下数据的大小吧。
每个像素的低 bit 位相比高 bit 位对整体数据的影响较小。比如舍掉 8bit 位的最后两位,对于该 8bit 位整体数据的误差不过是加减 {0,4} 。准寻这种规则,因此有了 RGB565 格式,它的数据相比与 RGB888 作了裁剪,但整体的数据量,从 24bits/pixel 降低到 16bits/pixel。后台在使用这种作了裁剪的数据时可以根据这种约定的裁剪规则,再恢复出 24bits 的 RGB888 值:
在这里插入图片描述

RGB888与 RGB565 对应的 bit 图(图片来自网络wiki)

之所以让绿色相比其他颜色多一个 bit,是因为有的图像主要用来人眼观看,有研究表明人眼对绿色更为敏感,所以让 绿色保留的多一些。 无独有偶,一些应用场景的图片并不是给人眼观看,也许是机器直接对数据进行了处理,抑或拍摄的场景本身绿色的物体就不多,这样可以对数据进行更加均匀的裁剪,比如这种 RGB555 格式,使得三种颜色均占据 5bits,最高位的 bit 缺省:

在这里插入图片描述
不管哪种方式,我们再应用这些RGB数据类型时,都可以根据约定的规则,还原出其对应的 R、G、B 颜色。比如根据 RGB555 的存储方式,提取得到获取R,G,B分量的值。可以使用:

R = color & 0x7C00, (获取高字节的5个bit) 
G = color & 0x03E0, (获取中间5个bit)
B = color & 0x001F, (获取低字节5个bit)

再比如根据 RGB888中的8bit R、G、B 分量转换得到 RGB565:

short int rgb565_pixel; 
rgb565_pixel = ((R >> 3) << 11) | ((G >> 2) << 5) | (B >> 3);

用位数表示的 RGB 格式

除了上述的 RGB888、RGB555、RGB565 这种按照颜色对应的 Bit 位来描述的方法外,也有一些国家喜欢用总的位数来表示对应的 RGB 值(世界这么大,大家提一个自己喜欢的格式称呼也OK啦)。

RGB24:

RGB24, 一个像素用24个bit == 3个字节来表示,R, G,B分量分别用8个bit来表示。典型的就是上述 RGB888了。

RGB32

一些处理器在处理数据时需要 32bits 对齐,以快速处理图像数据。因此便有了 RGB32:
在这里插入图片描述

RGB4、RGB16

有的拍摄场景需要识别的颜色本来就不多,其表示颜色的方法,可以通过缺省一些颜色的 bit,来减小数据量。这些类型的方法与上述表示方法的原理类似。具体的表示方法可以咨询摄像头厂商来进一步确认。

当3D效果、或者阴影变得重要-RGBA

一些游戏设计或者图像处理时,会使用到带物体轮廓的颜色格式。典型的就是 ARGB 格式,其中:
在这里插入图片描述

ARGB 数据组成(图片来自网络wiki)

确切地说,ARGB 格式是 ARGB8888 格式(也称为 ARGB32)。ARGB 其分别是Alpha、Red、Green、Blue的缩写,因为其包含了该像素附近的4个信息,也被称为 4通道 表示方法。其中 alpha 是物体轮廓、透明度的意思。只有 alpha 的图像是灰度图像(灰度图像的示例我们将在下面的讨论中讲到),这在一些 3D 游戏或者图像处理中有额外的用处。比如使用 RGB888,与使用 ARGB8888 的图像区别:
在这里插入图片描述

ARGB 数据与 RGB 数据的比较(图片来自网络wiki)

相比 RGB888,ARGB8888 图中,小树的下面显示了树的阴影。3D 立体感来了没有,老铁们?

小问题:了解 ARGB8888 后,相信大家应该知道 RGBA32 代表的意思了。牛皮!

总结

1)本文从摄像头工作的基本原理说起,Camera sensor 通过滤光片采集不同颜色的数据,生成 RAW 数据。
2)RAW 格式的数据,根据对每种颜色的表示使用几个 bit,也可以分为 RAW8、RAW10、RAW12 等类型。
3)RGB 数据是 RAW 数据组合得到的,根据组合顺序,可以组合得到 RGB、BGR 等格式的数据。
4)一些应用场景需要的数据带宽小、或者需要采集的颜色类型不多,这种情况下可以使用数据量更小的 RGB565、RGB555 等格式。
5)一些以总的数据长度命名的 RGB 格式的数据有 RGB24、RGB16、RGB32 等。
6)一些特别的应用场景还带有 Alpha 值,因此有 ARGB、RGBA 这种类型的 RGB 数据。
(码字不易,感谢点赞或收藏,谢绝未经授权的转载)

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

iOS17.0.2更新修复iPhone 15系列机型数据迁移问题,附新机快速数据迁移办法!

iPhone 15 系列机型已于今日正式发售&#xff0c;为解决iPhone15这些机型出现的数据迁移问题&#xff0c;苹果紧急发布了 iOS 17.0.2 更新&#xff0c;内部版本号为 21A350。 需要注意的是&#xff0c; iOS 17.0.2 更新仅适用于 iPhone 15、iPhone 15 Plus、iPhone 15 Pro 和 …

HTML5福利篇--使用Canvas画图

目录 一.Canvas元素 1.Canvas元素定义 2.使用JavaScript获取页面中的Canvas对象 二.绘制图形 1.绘制直线 2.绘制矩形 &#xff08;1&#xff09;rect() &#xff08;2&#xff09;strokeRect() &#xff08;3&#xff09;fillRect()和clearRect()函数 3.绘制圆弧 4.…

华为云云耀云服务器L实例评测 | 基于minikube搭建单节点kubernetes集群

目录 1 安装Docker2 conntrack-tools3 安装minikube4 下载二进制&#xff1a;kubeadm、kubectl、kubelet5 准备镜像6 启动minikube7 简单测试 ​ Minikube 是一个使用golang开发的单节点kubernetes集群环境&#xff0c;在资源紧张的情况下&#xff0c;可以用于快速搭建kubernet…

项目进展(一)-晶振正常输出、焊接驱动芯片、查找芯片手册并学习

今天的主要工作集中在博士师兄的项目上&#xff0c;效率偏低&#xff0c;主要是一中午的时间都卡在晶振上。在焊接完芯片和晶振之后&#xff0c;测试晶振输出引脚无输出&#xff0c;所以就开始找各种博客&#xff0c;寻找晶振不起振的原因&#xff0c;在下面两篇文章中找到了答…

基于骨架的动作识别:SkeleTR: Towrads Skeleton-based Action Recognition in the Wild

论文作者&#xff1a;Haodong Duan,Mingze Xu,Bing Shuai,Davide Modolo,Zhuowen Tu,Joseph Tighe,Alessandro Bergamo 作者单位&#xff1a;The Chinese University of Hong Kong; AWS AI Labs. 论文链接&#xff1a;http://arxiv.org/abs/2309.11445v1 内容简介&#xff1…

JavaScript+canvas实现粒子动画效果

1.HTML部分 <!DOCTYPE html> <html lang"zh"><head><meta charset"UTF-8" /><meta name"viewport" content"widthdevice-width, initial-scale1.0" /><title>粒子效果</title><style&g…

OpenAI官方吴达恩《ChatGPT Prompt Engineering 提示词工程师》(7)聊天机器人 / ChatBot

聊天机器人 / ChatBot 使用大型语言模型来构建你的自定义聊天机器人 在本视频中&#xff0c;你将学习使用OpenAI ChatCompletions格式的组件构建一个机器人。 环境准备 首先&#xff0c;我们将像往常一样设置OpenAI Python包。 import os import openai from dotenv import…

图像练习-答题卡opencv(02)

原图 结果 代码 // Load source imagecv::Mat src cv::imread("answer_card.jpg", cv::IMREAD_COLOR);if (src.empty()){return;}cv::Mat gray;cv::cvtColor(src, gray, cv::COLOR_BGR2GRAY);cv::Mat binary;double value cv::threshold(gray, binary, 0, 255, …

用PHP实现极验验证功能

极验验证是一种防机器人的验证机制&#xff0c;可以通过图像识别等方式来判断用户是否为真实用户。在实现极验验证功能时&#xff0c;您需要进行以下步骤&#xff1a; 1 注册极验账号&#xff1a; 首先&#xff0c;您需要在极验官网注册账号并创建一个应用&#xff0c;获取相应…

x_ctf_b0verfl0w

x_ctf_b0verfl0w Arch: i386-32-little RELRO: Partial RELRO Stack: No canary found NX: NX disabled PIE: No PIE (0x8048000) RWX: Has RWX segments32位&#xff0c;保护全关&#xff0c;写shellcode int vul() {char s[32]; // [esp18h] [eb…

mac安装 scala 详细教程(包含在 idea 上使用,以及scala插件安装)

目录 一 下载解压 二 配置环境变量 三 测试 scala 四 idea 编写 scala 文件 1. 安装插件 scala 插件 2. 使用 idea 创建 scala 工程 3. 使用idea 创建 maven 工程开发 scala 一 下载解压 去官网选择合适的版本下载 官网地址https://www.scala-lang.org/download/all.…

RocketMQ高性能核心原理与源码架构剖析

文章目录 1、源码环境搭建1.1、主要功能模块1.2、源码启动服务1.2.1、 启动nameServer1.2.2、 启动Broker1.2.3、 发送消息1.2.4、 消费消息 2、源码剖析2.1、NameServer的启动过程2.2、Broker服务启动过程2.3、Netty服务注册框架2.3.1、关注重点2.3.2、源码重点 1、源码环境搭…

进化的京东云DaaS:向大模型要解

通过新的DaaS大模型模式&#xff0c;京东云想要为企业提供的增长路径&#xff0c;恰是从最原始的“要数据”真正进阶到最终的“出效果”&#xff0c;将大模型和京东对增长的理解封装到整个产品矩阵中&#xff0c;帮助企业构建最适合AI时代的增长底盘。 作者|皮爷 出品|产业…

如何保障汽车嵌入式软件的质量与安全?您需要了解ASPICE标准

汽车软件开发流程改进与能力确定&#xff08;Automotive SPICE或ASPICE&#xff09;是一个流程评估模型&#xff0c;它帮助汽车原始设备制造商&#xff08;OEM&#xff09;和供应商评估当前企业软件开发流程的性能和成熟度水平。 遵守这一标准&#xff0c;有助于汽车供应商确保…

Apache Flume

Flume 1.9.0 Developer Guide【Flume 1.9.0开发人员指南】 Introduction【介绍】 摘自&#xff1a;Flume 1.9.0 Developer Guide — Apache Flume Overview【概述】 Apache Flume is a distributed, reliable, and available system for efficiently collecting, aggregati…

迁移 MySQL 数据到 OceanBase 集群

使用 mysqldump 将 mysql的表结构和数据同步到 OceanBase 的MySQL 租户中 Mysql数据库导出 mysqldump -h127.0.0.1 -P3306 -uroot –p --single-transaction --hex-blob --routines --events --triggers --set-gtid-purgedOFF --databases teller >teller.sql mysql> …

sentinel环境搭建以及微服务接入

• sentinel部署 • sentinel-镜像制造 • sentinel-镜像推送 • sentinel-部署配置文件 • 访问控制台 • 外网访问控制台 • 集群内访问 • 配置规则 • 限流效果 • 微服务接入 • pom文件引入依赖 • pod部署文件添加配置 Sentinel 控制台是流量控制、熔断降级规则统一配置…

下载github.com上的依赖资源

下载github.com上的依赖资源&#xff08;需要反复试才能成功&#xff0c;所以单独安装&#xff09; export GIT_TRACE1 export GIT_CURL_VERBOSE1 pip install githttps://github.com/PanQiWei/AutoGPTQ.git -i https://pypi.mirrors.ustc.edu.cn/simple --trusted-hostpypi.mi…

.NET 8 中的 WPF File Dialog 改进

作者&#xff1a;Dipesh Kumar 排版&#xff1a;Alan Wang 我们很高兴宣布从 .NET 8 Preview 7 开始&#xff0c;对 WPF 中的通用文件对话框 API 进行了一系列新的改进。其中包括迄今为止存储库中投票最多的 API 建议 – 允许用户选择文件夹的 OpenFolderDialog 控件 – 以及文…

灾备系统中虚拟机的有代理备份与无代理备份之间的差异

虚拟机的有代理备份是在虚拟机内部安装备份代理程序&#xff0c;然后把虚拟机当作物理机一样来进行备份任务。借助虚拟机系统中内置的程序来进行备份的&#xff0c;就像在正常系统中备份那样&#xff0c;借助备份和还原&#xff08;Windows7&#xff09;功能对系统进行备份。但…