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

文章目录

  • 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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Sentinel : 服务容错(降级熔断、流量整形)

什么是服务雪崩? 服务雪崩效应是一种因“服务提供者的不可用”(原因)导致“服务调用者不可用”(结果),并将不可用逐渐放大的现象。 我来用一个模拟场景带你感受一下服务雪崩的厉害之处。假设我有一个微服…

20 散列表的查找

散列表的查找 简介:散列表(也成哈希表)是一种高效的数据结构,他可以在平均复杂度为O(1)的情况下实现查找、插入和删除操作。 哈希表的基本思想是根据关键字的值来计算其应存储的位置。这个计算过程就是通过哈希函数来实现的。 根…

深度学习-第T5周——运动鞋品牌识别

深度学习-第T5周——运动鞋品牌识别 深度学习-第T5周——运动鞋品牌识别一、前言二、我的环境三、前期工作1、导入数据集2、查看图片数目3、查看数据 四、数据预处理1、 加载数据1、设置图片格式2、划分训练集3、划分验证集4、查看标签 2、数据可视化3、检查数据4、配置数据集 …

西瓜书读书笔记整理(三)—— 第二章 模型评估与选择

第二章 模型评估与选择 第 2 章 模型评估与选择2.1 经验误差与过拟合1. 错误率 / 精度 / 误差2. 训练误差 / 经验误差 / 泛化误差3. 过拟合 / 欠拟合4. 学习能力5. 模型选择 2.2 评估方法1. 评估方法概述2. 留出法3. 交叉验证法4. 自助法5. 调参 / 最终模型 2.3 性能度量1. 回归…

Ada语言学习(1)Basic Knowledge

文章目录 说在前头命名注释数字变量变量类型signed integersEnumerationsFloating Points 类型重用(继承)类型转换 运算符属性(Attributes)练习 说在前头 本系列教程将会通过提问的方式来完成整个学习过程,因为当你能…

86盒IP对讲一键报警器

86盒IP对讲一键报警器 86盒IP对讲一键报警器:革命性保障生命安全的利器! 随着科技的飞速发展,我们的生活变得越来越方便和智能化。而86盒IP对讲一键报警器更是在这种背景下应运而生。这款产品不仅无缝对接各种手机APP,也可以在智…

RabbitMQ --- 惰性队列、MQ集群

一、惰性队列 1.1、消息堆积问题 当生产者发送消息的速度超过了消费者处理消息的速度,就会导致队列中的消息堆积,直到队列存储消息达到上限。之后发送的消息就会成为死信,可能会被丢弃,这就是消息堆积问题。 解决消息堆积有三种…

互联网大厂测开面试记,二面被按地上血虐,所幸Offer已到手

在互联网做了几年之后,去大厂“镀镀金”是大部分人的首选。大厂不仅待遇高、福利好,更重要的是,它是对你专业能力的背书,大厂工作背景多少会给你的简历增加几分竞争力。 如何备战面试的? 第一步:准备简历 …

vue3回到上一个路由页面

学习链接 Vue Router获取当前页面由哪个路由跳转 在Vue3的setup中如何使用this beforeRouteEnter 在这个路由方法中不能访问到组件实例this,但是可以使用next里面的vm访问到组件实例,并通过vm.$data获取组件实例上的data数据getCurrentInstance 是vue3提…

51单片机也可以移植RTOS

说起RTOS移植,我们首先会想到32位单片机。 那么51单片机可以移植RTOS吗? 我的答案是,只要资源够用(ROM空间、RAM空间),可以移植。 前提是你对RTOS的实现原理非常清楚,并且可以自己完成移植工作…

数据可视化大屏的页面布局以及自适应

在做数据可视化大屏之前,我们需要考虑到页面的布局问题以及页面缩放自适应问题,下面分别就这两个方面讲解。 页面布局 类似这种页面区块的明显划分,常用的布局方式有两种: 1、flex布局 2、grid布局 grid布局 grid布局可以按区块…

深度学习用于医学预后-第二课第四周5-10节-为个体患者制定风险评估模型

文章目录 相对风险按风险对患者进行排序个体与基线风险吸烟者与不吸烟者年龄对风险的影响 在本课中,您将学习 Cox 比例风险模型(Cox Proportional Hazards Model)。您将了解 Cox 模型如何考虑患者变量来比较不同患者的风险,使用他们的患者概况。 但到目前…

mysql增量备份

目录 一、修改配置文件,开启增量备份功能 (1)查看是否已经开启了 (2)修改配置文件开启 (3)增量记录文件 二、还原增量备份 (1)修改了数据 (2&#xff…

nginx keepalive 高可用原理和实操

文章目录 前言一、nginxkeepalive搭建高可用服务方案?二、方案解析1.keepalive是什么2.nginx是什么 三、keepalive与nginx环境安装四、高可用配置实例总结 前言 一、nginxkeepalive搭建高可用服务方案? 使用nginx-keepalived双机热备机制,vi…

【云计算•云原生】4.云原生之什么是Kubernetes

文章目录 Kubernetes概念Kubernetes核心概念集群podConfigMap Kubernetes架构master节点的组件worker节点组件 Kubernetes网络架构内部网络外部网络 k8s各端口含义 Kubernetes概念 K8S就是Kubernetes,Kubernetes首字母为K,末尾为s,中间一共有…

BEV(0)---Transformer

1 Transformer Transformer是一个Sequence to Sequence model,特别之处在于它大量用到了self-attention,替代了RNN,既考虑了Sequence的全局信息也解决了并行计算的问题。 1.1 self-attention: ①. 输入x1 ~ x4为一个sequence&…

MySQL基础(三十一)数据库其它调优策略

1 数据库调优的措施 1.1 调优的目标 尽可能 节省系统资源 ,以便系统可以提供更大负荷的服务。(吞吐量更大)合理的结构设计和参数调整,以提高用户操作 响应的速度 。(响应速度更快)减少系统的瓶颈&#xf…

服务网关Gateway

前言 API 网关出现的原因是微服务架构的出现,不同的微服务一般会有不同的网络地址,而外部客户端可能需要调用多个服务的接口才能完成一个业务需求,如果让客户端直接与各个微服务通信,会有以下的问题: 破坏了服务无状态…

DJ6-4 文件存储空间的管理

目录 6.4.1 空闲表 1、存储空间的分配与回收 2、空闲表法的优缺点 6.4.2 空闲链表 1、空闲盘块链 2、空闲盘区链 6.4.3 位示图 1、位示图的表示 2、存储空间的分配 3、存储空间的回收 4、位示图法的优缺点 6.4.4 成组链接 1、空闲盘块的组织 plus 个人理解图…

上海亚商投顾:沪指震荡调整跌0.21% 两市成交金额不足8000亿

上海亚商投顾前言:无惧大盘涨跌,解密龙虎榜资金,跟踪一线游资和机构资金动向,识别短期热点和强势个股。 市场情绪 三大指数今日震荡调整,上证50午后一度跌超1%,以保险为首的权重板块走低。军工股逆市大涨&a…