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

目录

一、通用属性

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.rhkb.cn/news/176103.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

有效的数独

题目链接 有效的数独 题目描述 注意点 board.length 9board[i].length 9board[i][j] 是一位数字(1-9)或者 ‘.’ 解答思路 首先判断行是否满足数独条件,再判断列是否满足数独条件,最后再判断划分的3x3方格是否满足数独条件…

Yakit工具篇:WebFuzzer模块之重放和爆破

简介 Yakit的Web Fuzzer模块支持用户自定义HTTP原文发送请求。为了让用户使用简单,符合直觉,只需要关心数据相关信息,Yakit后端(yaklang)做了很多工作。 首先我们先来学习重放请求的操作,在日常工作中可以使用 Web Fuzzer进行请…

32、github的使用小技巧

如何在github中阅读项目代码 如果要完整阅读项目代码, 可能要在文件间来回跳转,就非常麻烦。所以我们往往会把项目代码下载到本地,用更强大的编辑器来阅读。 在github中,可以这样操作: 登录 GitHub 后,直…

【Linux】第四站:Linux基本指令(三)

文章目录 一、时间相关的指令1.指令简介2.使用 二、cal指令三、find指令 -name1.介绍2.使用 四、grep指令1.介绍2.使用 五、zip/unzip指令1.介绍2.zip的安装3.使用 六、tar指令:打包解包,不打开它、直接看内容1.介绍2.使用 七、bc指令八、uname -r指令1.…

【Linux】配置JDKTomcat开发环境及MySQL安装和后端项目部署

目录 一、jdk安装配置 1. 传入资源 2. 解压 3. 配置 二、Tomcat安装 1. 解压开启 2. 开放端口 三、MySQL安装 1. 解压安装 2. 登入配置 四、后端部署 1. 数据库 2. 导入.war包 3. 修改端口 4.开启访问 一、jdk安装配置 打开虚拟机 Centos 登入账号&#xff…

数字孪生技术与VR:创造数字未来

在当今数字化浪潮中,数字孪生和虚拟现实(VR)技术是两大亮点,它们以独特的方式相互结合,为各个领域带来了创新和无限可能。本篇文章将探讨数字孪生与VR之间的关系,以及它们如何共同开辟未来的新前景。 数字…

Linux 基本语句_9_C语言_生产者消费者

完整版生产者代码&#xff1a; #include <stdio.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include <unistd.h> #include <stdlib.h> #include <sys/file.h> #include <string.h>#define MAXLE…

ElasticSearch(ES)8.1及Kibana在docker环境下如何安装

ES基本信息介绍 Elasticsearch&#xff08;简称ES&#xff09;是一个开源的分布式搜索和分析引擎&#xff0c;最初由Elastic公司创建。它属于Elastic Stack&#xff08;ELK Stack&#xff09;的核心组件之一&#xff0c;用于实时地存储、检索和分析大量数据。 以下是Elastics…

云起无垠典型案例入选《2023软件供应链安全洞察》报告

近日&#xff0c;历时6个月&#xff0c;由ISC编制的《2023软件供应链安全洞察》报告&#xff08;以下简称《报告》&#xff09;正式对外发布。《报告》围绕软件供应链安全现状、技术内核、治理指南、落地实践展开&#xff0c;以期为行业从业者提供有价值的信息和洞见&#xff0…

GoLong的学习之路(十六)基础工具之Gin框架

Gin框架介绍及使用&#xff0c;这张不用看内容就知道非常重要&#xff0c;重要到什么地步呢&#xff1f;重要到开发java不会Spring全家桶这种概念。 上几篇文章写的是如何构建骨架&#xff0c;经脉。这一章是将血肉注入。 文章目录 Gin框架RESTful API Gin渲染HTML渲染静态文件…

【mfc/VS2022】计图实验:绘图工具设计知识笔记3

实现类对串行化的支持 如果要用CArchive类保存对象的话&#xff0c;那么这个对象的类必须支持串行化。一个可串行化的类通常有一个Serialize成员函数。要想使一个类可串行化&#xff0c;要经历以下5个步骤&#xff1a; 1、从CObject派生类 2、重写Serialize成员函数 3、使用DE…

PostGreSQL:数据表继承

PostGreSQL手册的简史部分介绍到&#xff1a;被称为PostGreSQL的对象关系型数据库管理系统&#xff0c;由美国加州大学伯克利 分校编写的POSTGRES软件包发展而来。经过十几年的发展&#xff0c;PostGreSQL目前是世界上最先进的开源数据库。 The object-relational database man…

【C++】string类

STL STL(standard template libaray-标准模板库)&#xff1a;是C标准库的重要组成部分&#xff0c;不仅是一个可复用的组件库&#xff0c;而且是一个包罗数据结构与算法的软件框架。 为什么学习string类&#xff1f; 1、C语言中的字符串 C语言中&#xff0c;字符串是以\0结尾…

计组之存储系统

存储器概述 分类 1.按在计算机中的作用&#xff08;层次&#xff09;分类 主存储器。CPU可以直接随机地对其进行访问&#xff0c;也可以和高速缓冲存储器&#xff08;Cache)及辅助存储器交换数据。辅助存储器。辅存的内容需要调入主存后才能被CPU访问。高速缓冲存储器。位于…

SSM咖啡点餐管理系统开发mysql数据库web结构java编程计算机网页源码eclipse项目

一、源码特点 SSM 咖啡点餐管理系统是一套完善的信息系统&#xff0c;结合SSM框架完成本系统&#xff0c;对理解JSP java编程开发语言有帮助系统采用SSM框架&#xff08;MVC模式开发&#xff09;&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主 要采用B/S模式开…

Spring@Lazy是如何解决构造函数循环依赖问题

Spring实例化源码解析之循环依赖CircularReference这章的最后我们提了一个构造函数形成的循环依赖问题&#xff0c;本章就是讲解利用Lazy注解如何解决构造函数循环依赖和其原理。 准备工作 首先创建两个构造函数循环依赖的类&#xff0c;TestA和TestB&#xff0c;代码如下&am…

通用开源自动化测试框架 - Robot Framework

一、什么是 Robot Framework&#xff1f; 1. Robot Framework 的历史由来 Robot Framework是一种通用的自动化测试框架&#xff0c;最早由Pekka Klrck在2005年开发&#xff0c;并由Nokia Networks作为内部工具使用。后来&#xff0c;该项目以开源形式发布&#xff0c;并得到了…

Py之pypdf:pypdf的简介、安装、使用方法之详细攻略

Py之pypdf&#xff1a;pypdf的简介、安装、使用方法之详细攻略 目录 pypdf的简介 pypdf的安装 pypdf的使用方法 1、基础用法 pypdf的简介 pypdf是一个免费的、开源的纯python PDF库&#xff0c;能够拆分、合并、裁剪和转换PDF文件的页面。它还可以为PDF文件添加自定义数据…

喜讯!合合信息顺利通过CMMI3级评估

近日&#xff0c;在擎标顾问团的咨询辅导下&#xff0c;上海合合信息科技股份有限公司&#xff08;简称“合合信息”&#xff09;顺利通过了CMMI3级评估。CMMI是国际上最流行、最实用的一种软件生产过程标准和软件企业成熟度等级认证的标准&#xff0c;通过该认证表明企业在开发…

CS224W1.1——图机器学习介绍

文章目录 1. 介绍2. 主要问题3. 深度学习如何应用在图结构中4. 课程大纲 学习一下斯坦福CS224W的图机器学习&#xff08;2021年&#xff09;&#xff0c;并做一下学习笔记&#xff0c;主要是研究方向与图神经网络相关。这次是第一次笔记&#xff0c;图片很多都是从斯坦福的PPT里…