【图像基础知识】常见图像格式

news2024/11/28 22:51:40

文章目录

  • 1 简介
  • 2 RGB
  • 3 BGR
  • 4 YUV
    • 4.1 YUV常见格式
    • 4.2 YUV420详解
    • 4.3 NV12
  • 5 Gray
  • 6 图像格式之间的转换
  • 7 参考链接

原文来自于地平线开发者社区,未来会持续发布深度学习、板端部署的相关优质文章与视频,如果文章对您有帮助,麻烦给点个赞,如果您有兴趣一起学习,欢迎点个关注:寻找永不遗憾(CSDN用户名)

1 简介

随着人工智能的发展,深度神经网络在视觉领域“百花齐放”,为了满足不同场景的需求,我们会接触到多种图像数据格式,本文将为大家详细地介绍深度学习场景中常用的图像数据格式:RGB、BGR、YUV(YUV444、NV12)、Gray。

2 RGB

RGB是一种常见的彩色图像格式,图像的每一个像素点都会存储红(Red)、绿(Green)、蓝(Blue) 三个颜色通道的亮度值( 0 ~ 255,UINT8 )。基于此,如果按(R,G,B)的方式记录,那么(255,0,0)、(0,255,0)、(0,0,255)可以分别表示最纯粹的 红、绿、蓝,效果如下图所示。特殊地,若 RGB 三个通道的数值均为 0,综合得到黑色;若三个通道的数值均取最大值 255,综合得到白色。

RGB 可表示的色彩数量可达256x256x256≈1677 万,远超人眼的感知范围(约 1000 万种),因此,RGB 被广泛应用于各种显示领域,与大家的日常生活息息相关。
然而,RGB 在表示颜色时有一个特点,每个像素点必须同时存储 R、G、B 三个通道数值,即每个像素点需要3个字节的存储空间,针对视频场景的存储与传输是非常不友好的,会占用大量的空间和带宽。

3 BGR

BGR图像格式与RGB类似,只是红、绿、蓝三个通道的排列顺序不同。在BGR格式中,像素点的通道顺序是蓝、绿、红,在RGB格式中,像素点的通道顺序是红、绿、蓝。
BGR格式常用于OpenCV等计算机视觉库中,是一些软件和硬件的默认图像格式,与这些软件和硬件的兼容性更好。
BGR与RGB一样,数据量较大,不适合视频场景的存储与传输。因此,我们还需要其他的图像格式,用来替代 RGB/BGR 用于视频领域,此时,YUV闪亮登场。

4 YUV

YUV是一种彩色图像格式,其中Y表示亮度(Luminance),用于指定一个像素的亮度(可以理解为是黑白程度),U和V表示色度(Chrominance或Chroma),用于指定像素的颜色,每个数值都采用UINT8表示,如下图所示。YUV格式采用亮度-色度分离的方式,也就是说只有U、V参与颜色的表示,这一点与RGB是不同的。

不难发现,即使没有 U、V 分量,仅凭 Y 分量我们也能 “识别” 出一幅图像的基本内容,只不过此时呈现的是一张黑白图像。而 U、V 分量为这些基本内容赋予了色彩,黑白图像演变为了彩色图像。这意味着,我们可以在保留 Y 分量信息的情况下,尽可能地减少 U、V 两个分量的采样,以实现最大限度地减少数据量,这对于视频数据的存储和传输是有极大裨益的。这也是为什么,YUV 相比于 RGB 更适合视频处理领域。

4.1 YUV常见格式

据研究表明,人眼对亮度信息比色彩信息更加敏感。YUV下采样就是根据人眼的特点,将人眼相对不敏感的色彩信息进行压缩采样,得到相对小的文件进行播放和传输。根据Y和UV的占比,常用的YUV格式有:YUV444,YUV422,YUV420三种。
用三个图来直观地表示不同采集方式下Y和UV的占比。

YUV444:每一个 Y 分量对应一对 UV 分量,每像素占用 3 字节(Y + U + V = 8 + 8 + 8 = 24bits);
YUV422:每两个 Y 分量共用一对 UV 分量,每像素占用 2 字节(Y + 0.5U + 0.5V = 8 + 4 + 4 = 16bits);
YUV420:每四个 Y 分量共用一对 UV 分量,每像素占用 1.5 字节(Y + 0.25U + 0.25V = 8 + 2 + 2 = 12bits);
此时来理解 YUV4xx 中的4,这个4,实际上表达了最大的共享单位!也就是最多4个Y共享一对UV。

4.2 YUV420详解

在YUV420中,一个像素点对应一个Y,一个4X4的小方块对应一个U和V,每个像素占用1.5个字节。依据不同的UV分量排列方式,还可以将YUV420分为YUV420P和YUV420SP两种格式。
YUV420P是先把U存放完,再存放V,排列方式如下图:

YUV420SP是UV、UV交替存放的,排列方式如下图:

此时 ,相信大家就可以理解为什么 YUV420 数据在内存中的长度是 width * height * 3 / 2 啦!

4.3 NV12

NV12图像格式属于YUV颜色空间中的YUV420SP格式,每四个Y分量共用一组U分量和V分量,Y连续存放,U与V交叉存放。
NV12在保持图像亮度信息的同时,数据量是RGB/BGR等格式的一半,可以减少模型加载输入数据的时间,因此,嵌入式端通常选用NV12作为部署时的图像数据输入。
在一些嵌入式端模型推理的场景下,计算硬件申请DDR内存存储NV12数据时,又可以细分为两种情况,在此分别命名为 HB_DNN_IMG_TYPE_NV12 数据格式和 HB_DNN_IMG_TYPE_NV12_SEPARATE 数据格式。
对于HB_DNN_IMG_TYPE_NV12 数据格式,Y分量和UV分量存储在一片连续的内存空间中,对于HB_DNN_IMG_TYPE_NV12_SEPARATE 数据格式,Y分量和UV分量分别存储在两块不同的内存空间中。
在这里插入图片描述

5 Gray

Gray图像格式,也称为灰度图像格式,是一种单通道图像格式。在Gray图像中,每个像素只包含一个亮度值,每个数值都采用UINT8表示,即0~255之间的整数。这个亮度值表示图像中每个像素的明暗程度,取值越大表示像素越亮,取值越小表示像素越暗。
Gray图像格式也是其他彩色图像格式(如RGB、YUV等)转换为单通道图像时的一种常见格式,只包含图像的亮度信息,图像数据相对较小,针对一些对图像色彩信息不太敏感的场景,仍然具有重要的应用价值。

6 图像格式之间的转换

了解不同图像格式应用场景之后,不知道大家有没有这样的疑惑:既然在图像采集、显示方面,我们主要使用 RGB,但是在图像存储、处理、传输方面,我们又要选择 YUV,在一个完整的应用场景中,可能会需要用到不同的图像格式,这时该怎么办呢?
图像格式转换华丽登场解决了这个问题,那如何实现图像格式之间的转换呢?可以简单地理解为,有一个“标准”,基于这个标准,通过一定的数学运算即可完成不同图像格式之间的转换。下面以计算机视觉库opencv封装好的函数为例,看一下如何实现图片格式转换:

import cv2

# 读取图片,opencv读取图片默认为BGR格式
bgr_img = cv2.imread('example.jpg')
cv2.imwrite('bgr_image.jpg', bgr_img)

# 将BGR格式转换为RGB格式
rgb_img = cv2.cvtColor(bgr_img, cv2.COLOR_BGR2RGB)
cv2.imwrite('rgb_image.jpg', rgb_img)

# 将BGR格式转换为YUV444格式
yuv_img = cv2.cvtColor(bgr_img, cv2.COLOR_BGR2YUV)
cv2.imwrite('yuv_image.jpg', yuv_img)

# 将BGR格式转换为GRAY格式
gray_img = cv2.cvtColor(bgr_img, cv2.COLOR_BGR2GRAY)
cv2.imwrite('gray_image.jpg', gray_img)

地平线工具链开发包OpenExplorer中提供了常见图像格式之间的转换源码(例如:RGB2NV12、BGR2RGB等),图片处理常用transformer说明文档请参考用户手册 图片处理transformer说明 章节,对应的源码位于OE开发包的ddk/samples/ai_toolchain/horizon_model_convert_sample/01_common/python/data路径下,欢迎感兴趣的同学参考使用。
最后,不同的图像格式具有不同的性能和优缺点,实际使用时,大家可以根据自己的需求,个性化选择图像格式。

7 参考链接

https://blog.csdn.net/onion2007/article/details/46805335
https://zhuanlan.zhihu.com/p/538058910
https://zhuanlan.zhihu.com/p/248116694
https://blog.csdn.net/zego_0616/article/details/126658494
https://blog.csdn.net/luoyingxing/article/details/108516163

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

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

相关文章

基于趋动云部署秋葉aaaki的Stable Diffusion整合包v4--linux版

B站大V秋葉aaaki的Stable Diffusion整合V4版发布了,集成度比较高,在windows下解压缩直接就可以使用,整合的非常好。但是笔人没有RTX4090这样级别的显卡,又希望有个高速运行的效果。 所以索性到云GPU主机上来用秋叶aaaki的Stable …

1.环境搭建

1.Windows 系统GolangVisual Studio CodeMicrosoft Windows (x86-64)go1.20.1.windows-amd64.msihttps://code.visualstudio.com/DownloadMicrosoft Windows (x86-i386)go1.20.1.windows-386.msihttps://code.visualstudio.com/DownloadMicrosoft Windows (ARM64)go1.20.1.win…

《疯狂Java讲义》读书笔记4

初始化块 是构造器的补充,在构造器之前执行。 是一段固定的代码,不接受任何参数。 构造器其实是一个假象,编译Java类后,初始化块会消失,当中的代码被还原到构造器中,且位于构造器前面。 静态初始化块 用…

springboot+vue家政服务管理平台(源码+文档)

风定落花生,歌声逐流水,大家好我是风歌,混迹在java圈的辛苦码农。今天要和大家聊的是一款基于springboot的家政服务管理平台。项目源码以及部署相关请联系风歌,文末附上联系信息 。 💕💕作者:风…

R语言相关系数的可视化

R相关系数的可视化 文章目录 R相关系数的可视化[toc]1、序列自相关2、序列偏自相关3、简单相关4、相关图可视化5、不同方法6、其他一些修饰 1、序列自相关 自相关是指同一时间序列在不同时间 t t t上取值的相关程度,假设时间序列 { X t } t 1 T \{X_t\}_{t1}^{T} …

电子电气架构——车载以太网防火墙

我是穿拖鞋的汉子,魔都中坚持长期主义的工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 本文主要分享关于车用基础软件的内核和中间件核心技术—虚拟化的典型应用案例。 车辆内部的以太网网络是一个相对封闭的环境,没有因特网那么复杂。由于车辆…

[LeetCode周赛复盘] 第 345 场周赛20230514

[LeetCode周赛复盘] 第 345 场周赛20230514 一、本周周赛总结6430. 找出转圈游戏输家1. 题目描述2. 思路分析3. 代码实现 6431. 相邻值的按位异或1. 题目描述2. 思路分析3. 代码实现 6433. 矩阵中移动的最大次数1. 题目描述2. 思路分析3. 代码实现 6432. 统计完全连通分量的数…

多核与多处理器的区别

一、定义 多核:单块CPU上面能处理数据的芯片组的数量,比如,双核就是包括2个相对独立的CPU核心单元组,四核就包含4个相对独立的CPU核心单元组。 多处理器:主板上实际插入的cpu数量,一般有两个或者多个处理…

AutoSar之DaVinci开发环境

文章目录 前言一、AutoSar架构简介二、开发环境组成1.DaVinci Developer2.DaVinci Configurator3.SIP 总结 前言 作为初学者,接触AutoSar的开发,除了需要掌握基本的AutoSar架构知识外,还需要熟悉设计和配置AutoSar的工具链。接下来我会以Vec…

ChatGPT在小红书文案实践

今天聊一聊ChatGPT在小红书这个实际应用场景的案例。ChatGPT 以较低的门槛提高了使用者创作水平,有较高的下限,但如何创造更高质量的内容就要依靠使用者在领域的能力和AI使用技巧,作者无任何小红书推广和文案写作经验,文章内容来自…

【MySQL】C语言连接数据库

在使用数据库的时候&#xff0c;我们是操作客户端方的&#xff0c;向服务器请求数据。MySQL的端口号-3306 连接mysql需要头文件&#xff1a;#include<mysql/mysql.h> 基础连接步骤&#xff1a; 1.创建连接句柄 MYSQL mysql_con;//连接句柄 2.初始化连接句柄mysql_i…

LabVIEWCompactRIO 开发指南18 使用网络流发送消息和命令

LabVIEWCompactRIO 开发指南18 使用网络流发送消息和命令 默认情况下&#xff0c;网络流旨在最大化吞吐量&#xff0c;但可以轻松实现它们以最大化发送命令或消息的低延迟。 为本部分提供LabVIEW示例代码 命令发送器体系结构 命令发送器是CompactRIO控制器必须响应的任何命…

如何构建“Buy Me a Coffee”DeFi dApp

&#x1f978; 本教程来自官网&#xff1a;https://docs.alchemy.com/docs。对原文部分内容进行了修改。教程中所有实例经过本人实践&#xff0c;代码可见&#xff1a;https://github.com/ChuXiaoYi/web3Study 区块链技术令人惊叹&#xff0c;因为它使我们能够使用代码和软件编…

【Linux初阶】进程地址空间 | CUP与可执行程序的交互原理

&#x1f31f;hello&#xff0c;各位读者大大们你们好呀&#x1f31f; &#x1f36d;&#x1f36d;系列专栏&#xff1a;【Linux初阶】 ✒️✒️本篇内容&#xff1a;计算机空间初识&#xff08;子进程变量修改实验&#xff09;&#xff0c;感性理解进程虚拟地址空间&#xff0…

Web自动化测试工具大对决:细致比较Selenium、Protractor和Cypress

目录 前言&#xff1a; Selenium Protractor Cypress 结论 Web自动化测试步骤结构图&#xff1a; 前言&#xff1a; 随着Web应用程序的广泛使用&#xff0c;Web自动化测试工具的需求也越来越高。Web自动化测试工具可以模拟用户在Web浏览器中的行为&#xff0c;并且可以快…

NICE-SLAM学习

NICE-SLAM简介&#xff1a; 是浙大和ETH提出的一种神经隐式SLAM方法主要创新点在于解决了基于传统nerf的方案如imap无法应用在较大场景的问题。 关于该工程的前身和当前领域的主要研究现状见&#xff1a;&#xff08;知乎&#xff1a;秦通&#xff09;基于神经辐射场的&#…

接口自动化测试-Pytest核心固件Fixture详解以及应用实战

目录 前言&#xff1a; 一、Fixture概述 二、Fixture分类 在Pytest中&#xff0c;Fixture可以分为4类&#xff1a; 三、Fixture使用 下面结合实例说明如何使用Fixture。 3.1 session级别的Fixture 3.2 module级别的Fixture 3.3 function级别的Fixture 3.4 class级别的F…

2023.5.13前端设计

SpringbootVue架构设计&#xff08;一&#xff09; 项目中的文件来自B站视频&#xff08;程序员青戈&#xff09; https://www.bilibili.com/video/BV1U44y1W77D 前端设计 assets 文件夹通常用于存放静态资源文件&#xff0c;例如图像、CSS、字体等。components 文件夹通常用…

2023.5.14数据库设计

SpringbootVue架构设计&#xff08;二&#xff09; 项目中的文件来自B站视频&#xff08;程序员青戈&#xff09; https://www.bilibili.com/video/BV1U44y1W77D 数据库设计 1、article 在关系型数据库中&#xff0c;text类型和varchar类型都是用来存储字符串的数据类型。它…

【ShaderToy中图形效果转译到UnityShaderlab案例分享_Flame】

ShaderToy内的源码与效果图如下: float noise(vec3 p) //Thx to Las^Mercury {vec3 i = floor(p);vec4 a = dot(i