一文看懂图像格式 RAW、RGB、YUV、Packed/Unpacked、Bayer、MIPI、Planar、Semi-Planar、Interleaved

news2025/7/27 19:42:06

目录

一、通用属性

1. Packed/Unpacked

2. 压缩/非压缩

二、RAW

1. Bayer格式

2. 分类

3. MIPI RAW

三、RGB

分类

四、YUV

1. YUV与RGB转换

2. 分类

3. 内存计算

五、压缩格式


有的人,错过了,一生再也找寻不到。

本文详细分析各种图像格式(RAW、RGB、YUV)的分类、内存分布。一篇文章让你看懂。

一、通用属性

1. Packed/Unpacked

一个像素点占n个bit,如果n不是8的倍数,那么就有Packed、Unpacked的概念。试想某格式一个像素10bit(比如Raw10),如果Unpacked,那么实际一个像素要占2Byte=16bit,其中前10bit才有图像数据,后6bit占位(一般是0)。如果是Packed,那么就没有占位。

2. 压缩/非压缩

为方便大尺寸图像存储、传输,常用压缩的方法进行。

对于isp而言,常见压缩算法有FLC(Fixed Length Compression)、AFBC(Arm Frame Buffer Compression),JPEG等。

下文所讲内存分布均指非压缩格式,因为压缩后的内存分布由算法决定。

二、RAW

RAW的含义是“未经处理加工”。

RAW图像是CCD/CMOS等sensor直接采集到的图像,是光信号转化为电信号时的电平高低的原始记录。

1. Bayer格式

RAW一般采用Bayer格式(单个像素为R/G/B光强信息)进行排列,由于人眼对绿色更加敏感,因此增加对绿光的采样。主要有四种排序:

  • RGGB
  • BGGR
  • GRBG
  • GBRG

举例一个像素是8*8的sensor,BGGR格式的RAW图像:

要么你可能会问,一个像素只有一种颜色R/G/B,那我们看到的图像比如第一个像素不一定是只有B。因为后面会插值计算出每个pixel的其他分量!以降低功耗。 

2. 分类

  • RAW8:1 pixel 8 bits
  • RAW10Unpacked:1 pixel 2 Bytes(16bits,有6bit没用)
  • RAW10Packed:1 pixel 10 bits
  • RAW12Unpacked/RAW12Packed
  • RAW14Unpacked/RAW14Packed
  • RAW16
  • ......

RAW格式很大,往往需要压缩处理存入DDR。

3. MIPI RAW

MIPI RAW可以看做为一种Packed RAW,只是要按照MIPI RAW的存储规则来Packed。既然是Packed,举例来说,对于MIPI RAW10,5个Byte(40bits)就可以存4个像素的数据(4*10bits),没有空bit。

三、RGB

每个像素由三原色R/G/B组成,注意和RAW的区别,RAW每个像素只有一个三原色。

分类

  • RGB565:1 pixel 16 bits(R 5bits、G 6bits、B 5bits)
  • RGB555:1 pixel 16 bits(有1bit不用)
  • RGB24:1 pixel 24 bits(RGB各8bits)
  • RGB32:1 pixel 32 bits(RGB各8bits,有8bits不用)
  • ARGB32:1 pixel 32 bits(RGB各8bits,还有Alpha透明度8bits)

四、YUV

YUV是用一个亮度分量Y和两个色度分量U,V来描述一个颜色。只有Y的话就是灰度图像。

1. YUV与RGB转换

YUV转RGB

R = Y + 1.13983 * V
G = Y - 0.39465 * U - 0.58060 * V
B = Y + 2.03211 * U

RGB转YUV

Y = 0.299 * R + 0.587 * G + 0.114 * B
U = -0.14713 * R - 0.28886 * G + 0.436 * B
V = 0.615 * R - 0.51499 * G - 0.10001 * B

2. 分类

由于人眼对Y的敏感度远超对U、V的敏感度,所以有时可用多个Y共用一组U、V,既节省了空间又保证了质量。

常用格式分类:

  • YUV420,4个Y共用一套UV,数据个数1.5*w*h
  • YUV422,2个Y共用一套UV,数据个数2*w*h
  • YUV444,不共用,1个Y一套UV,数据个数3*w*h

如果一个像素是8bit,那么存储占用对于YUV420就是1.5*w*h*8 bits=1.5*w*h Bytes 。

YUV的内存分布按Y、U、V三个分量的排列顺序,可分为

  • Planar,三个分量分开存放
  • Semi-Planar,Y分量单独存放,UV分量交错一起存放
  • Packed/Interleaved,三个分量交错一起存放

注意:这里的Packed和图像的Packed是两个概念!这里的Packed指的是所有像素分量交错;图像的Packed是一个像素点n bits无空位排列。 

I420(也叫YU12,或YUV420 Planar)

总数据个数w*h+0.25*w*h+0.25*w*h=1.5*w*h

YYYY
YYYY
UU
VV

当然,对于计算机内存来说,只是从某个addr开始一直存储,先存Y再存U再存V

YV12(YVU420 Planar)

总数据个数w*h+0.25*w*h+0.25*w*h=1.5*w*h

YYYY
YYYY
VV
UU

NV12(YUV420 Semi-Planar)

总数据个数w*h+0.5*w*h=1.5*w*h

YYYY
YYYY
UVUV

NV21(YVU420 Semi-Planar)

总数据个数w*h+0.5*w*h=1.5*w*h

YYYY
YYYY
VUVU

I422(YUV422 Planar)

总数据个数w*h+0.5*w*h+0.5*w*h=2*w*h

YYYY
YYYY
UUUU
VVVV

 YV16(YVU422 Planar)

总数据个数w*h+0.5*w*h+0.5*w*h=2*w*h

YYYY
YYYY
VVVV
UUUU

  NV16(YUV422 Semi-Planar)

总数据个数w*h+0.5*w*h+0.5*w*h=2*w*h

YYYY
YYYY
UVUV
UVUV

  NV61(YVU422 Semi-Planar)

总数据个数w*h+0.5*w*h+0.5*w*h=2*w*h

YYYY
YYYY
VUVU
VUVU

YUVY(YUV422 Interleaved)

总数据个数w*h+0.5*w*h+0.5*w*h=2*w*h

YUVY YUVY
YUVY YUVY

 VYUY(VYU422 Interleaved)

总数据个数w*h+0.5*w*h+0.5*w*h=2*w*h

VYUY VYUY
VYUY VYUY

  UYVY(UYV422 Interleaved)

总数据个数w*h+0.5*w*h+0.5*w*h=2*w*h

UYVY UYVY
UYVY UYVY

I444(YUV 444 Planar)

总数据个数w*h*3

YYYY
YYYY
UUUU
UUUU
VVVV
VVVV

YV24(YVU 444 Planar)

总数据个数w*h*3

YYYY
YYYY
VVVV
VVVV
UUUU
UUUU

NV24(YUV 444 Semi-Planar)

总数据个数w*h*3

YYYY
YYYY
UVUVUVUV
UVUVUVUV

 NV42(YVU 444 Semi-Planar)

总数据个数w*h*3

YYYY
YYYY
VUVUVUVU
VUVUVUVU

YUV 444 Packed

总数据个数w*h*3

YUV YUV
YUV YUV

3. 内存计算

有了上面的基础,内存计算就超级简单。比如:

YUV420SP8,内存占用即为1.5*w*h Bytes

YUV420SP10 Unpacked,内存占用即为1.5*w*h*2 Bytes,因为Unpacked时10bit要占2Bytes,有6bits的空位。

YUV420SP10 Packed,内存占用即为1.5*w*h*10/8 Bytes。没用空位。

1920*1080的NV12 8bit图像,占内存为1.5*1920*1080 = 3,110,400 Bytes ≈ 3MB,这就是3MB图像的由来,内存占用还是挺大的。

五、压缩格式

JPEG,PNG,GIF,BMP,TIFF,TGA等等。

不断更新,还在路上......

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

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

相关文章

[GDOUCTF 2023]<ez_ze> SSTI 过滤数字 大括号{等

SSTI模板注入-中括号、args、下划线、单双引号、os、request、花括号、数字被过滤绕过(ctfshow web入门370)-CSDN博客 ssti板块注入 正好不会 {%%}的内容 学习一下 经过测试 发现过滤了 {{}} 那么我们就开始吧 我们可以通过这个语句来查询是否存在ss…

鸿蒙切换到主线程

鸿蒙和安卓都是一样的视图操作都需要在主线程或者UI(视图线程)中处理,否则就会报错。 在安卓中可以通过: View.post(new Runnable() {Overridepublic void run() {textView.setText("更新textView");} });runOnUiThread(new Runnable() {public void run…

算法学习打卡day36| 738.单调递增的数字、 968.监控二叉树、贪心算法阶段学习总结

738.单调递增的数字 力扣题目链接 题目描述&#xff1a; 当且仅当每个相邻位数上的数字 x 和 y 满足 x < y 时&#xff0c;我们称这个整数是单调递增的。 给定一个整数 n &#xff0c;返回 小于或等于 n 的最大数字&#xff0c;且数字呈 单调递增 。 示例 1: 输入: n 10 …

JVM虚拟机:通过一个例子解释JVM中栈结构的使用

代码 代码解析 main方法执行&#xff0c;创建栈帧并压栈。 int d8&#xff0c;d为局部变量&#xff0c;是基础类型&#xff0c;它位于虚拟机栈的局部变量表中 然后创建了一个TestDemo的对象&#xff0c;这个对象在堆中&#xff0c;并且这个对象的成员变量&#xff08;day&am…

安防视频监控平台EasyCVR(V.3.4)新功能:告警查询操作步骤

视频集中存储/云存储/视频监控管理平台EasyCVR能在复杂的网络环境中&#xff0c;将分散的各类视频资源进行统一汇聚、整合、集中管理&#xff0c;实现视频资源的鉴权管理、按需调阅、全网分发、智能分析等。AI智能大数据视频分析EasyCVR平台已经广泛应用在工地、工厂、园区、楼…

2024王道考研计算机组成原理——中央处理器

CPU的运算器其实就是进行固定的数据处理&#xff0c;后面讲的CPU主要侧重的是它的控制器功能 运算器的基本结构 左右两边都是16位&#xff0c;因为寄存器可能位于左右两端的一边(源/目的操作数) A、B两端都要接一堆线 通用寄存器 ALU都在运算器当中 从主存来的数据直接放到…

3201. 任务调度

有若干个任务需要在一台机器上运行。 它们之间没有依赖关系&#xff0c;因此可以被按照任意顺序执行。 该机器有两个 CPU 和一个 GPU。 对于每个任务&#xff0c;你可以为它分配不同的硬件资源: 在单个 CPU 上运行。在两个 CPU 上同时运行。在单个 CPU 和 GPU 上同时运行。在两…

RabbitMQ消息队列笔记

目录 docker Java 导包 配置文件 Work Queues 消息堆积 消息生产者发送消息到队列 消息消费者接收消息 Fanout交换机 Direct交换机发送消息 用Java代码创建交换机和队列、绑定 Direct交换机 Direct交换机发送消息 用Java代码创建交换机和队列、绑定 基于注解声明队…

Rust 语言常见的一些概念(上)

目录 1、变量的可变性 常量 隐藏 2、数据类型 2.1 标量类型 整型 浮点型 数值运算 布尔型 字符类型 复合类型 元组类型 数组类型 1、变量的可变性 变量默认是不可改变的&#xff08;immutable&#xff09;。这是 Rust 提供给你的众多优势之一&#xff0c;让你得以…

win32 读写UTF-8格式的文件的方法

1&#xff0c;写入数据 最开始是在写入数据前先写入三个字节 BYTE btHead[] { 0xEF,0xBB,0xBF }; ::WriteFile(hFile, btHead, 3, &dwWrite, 0); ::WriteFile(hFile, str, lstrlen(str)*sizeof(TCHAR), &dwWrite, 0);这样写入后文件样式为&#xff1a; 格式是UTF-8…

基于Python制作一个动物识别小程序

目录 引言研究背景目的与意义 动物识别技术概述基本原理图像处理与特征提取机器学习与深度学习方法 数据集与数据预处理数据收集与构建数据预处理步骤数据增强技术 特征提取与选择基础特征提取方法特征选择与降维 引言 研究背景 动物识别是计算机视觉和模式识别领域的重要研究…

《深入浅出OCR》实战:基于CRNN的文字识别

✨专栏介绍: 经过几个月的精心筹备,本作者推出全新系列《深入浅出OCR》专栏,对标最全OCR教程,具体章节如导图所示,将分别从OCR技术发展、方向、概念、算法、论文、数据集等各种角度展开详细介绍。 💙个人主页: GoAI |💚 公众号: GoAI的学习小屋 | 💛交流群: 7049325…

在python中加载tensorflow-probability模块和numpy模块

目录 操作步骤&#xff1a; 注意&#xff1a; 问题&#xff1a; 解决办法&#xff1a; 操作步骤&#xff1a; 在虚拟环境的文件夹中&#xff0c;找到Scripts文件夹&#xff0c;点击进去&#xff0c;找到地址栏&#xff0c;在地址栏中输入cmd&#xff0c;进入如下界面。 输…

国产数据库兼容过程中涉及的MySQL非严格模式

点击上方蓝字关注我 在国产数据库兼容适配过程中&#xff0c;经常遇到因源数据库是MySQL&#xff0c;迁移至其他国产数据库后&#xff0c;因MySQL端兼容模式有非严格模式&#xff0c;导致适配过程过程中需要做调整。那么&#xff0c;MySQL主要的非严格模式小结如下&#xff1a;…

约会杭州云栖2023:为了无法计算的价值一起努力

&#x1f3c6;作者简介&#xff0c;黑夜开发者&#xff0c;CSDN领军人物&#xff0c;全栈领域优质创作者✌&#xff0c;CSDN博客专家&#xff0c;阿里云社区专家博主&#xff0c;2023年6月CSDN上海赛道top4。 &#x1f3c6;数年电商行业从业经验&#xff0c;历任核心研发工程师…

C++初阶 类和对象(上)

前言&#xff1a;C初阶系列&#xff0c;每一期博主都会使用简单朴素的语言将对应的知识分享给大家&#xff0c;争取让所有人都可以听懂&#xff0c;C初阶系列会持续更新&#xff0c;上学期间将不定时更新&#xff0c;但总会更的 目录 一、什么是面向对象编程 二、什么是类和如…

AST反混淆实战|变种ob混淆还原指南一

关注它&#xff0c;不迷路。 本文章中所有内容仅供学习交流&#xff0c;不可用于任何商业用途和非法用途&#xff0c;否则后果自负&#xff0c;如有侵权&#xff0c;请联系作者立即删除&#xff01; 1.需求 ob混淆是我们最常见的混淆代码&#xff0c;标准的混淆 可以用星…

如何读懂深度学习python项目,以`Multi-label learning from single positive label`为例

Paper : Multi-label learning from single positive label Code 先读一读README.md 可能有意想不到的收获&#xff1b; 实验环境设置要仔细看哦&#xff01; 读论文 如何读论文&#xff0c;Readpaper经典十问 &#xff08;可能在我博客里有写&#xff09; How to read a …

【UE5】如何在UE5.1中创建级联粒子系统

1. 可以先新建一个actor蓝图&#xff0c;然后在该蓝图中添加一个“Cascade Particle System Component” 2. 在右侧的细节面板中&#xff0c;点击“模板”一项中的下拉框&#xff0c;然后点击“Cascade粒子系统&#xff08;旧版&#xff09;” 然后就可以选择在哪个路径下创建级…

Notepad++下载、使用

下载 https://notepad-plus-plus.org/downloads/ 安装 双击安装 选择安装路径 使用 在文件夹中搜索 文件类型可以根据需要设置 如 *.* 说明是所有文件类型&#xff1b; *.tar 说明是所有文件后缀是是tar的文件‘&#xff1b;