图形图像基础知识(1)---- RGB/YUV 颜色格式

目录

      • 常见RAW颜色格式
      • RGB类型
      • YUV类型
        • YUV类型汇总
        • YUV444类型
        • YUV422类型
        • YUV420类型
      • 参考实例

常见RAW颜色格式

  • RGB 类型:
    ARGB1010102,ABGR1010102,BGRA1010102,RGBA1010102
    ARGB8888,ABGR8888,BGRA8888,RGBA8888
    XRGB8888,XBGR8888,BGRX8888,RGBX8888
    RGB888,BGR888
    RGB565,BGR565

  • YUV 类型:
    8-bit YUV 4:2:2 2-plane
    8-bit YUV 4:2:2 1-plane(VYUY,YVYU)
    8-bit YUV 4:2:0(2-plane)
    8-bit YUV 4:2:0(3-plane)

RGB类型

RGB颜色空间以 R(Red:红)、G(Green:绿)、B(Blue:蓝) 三种基本色为基础,进行不同程度的叠加,产生丰富而广泛的颜色,所以俗称三基色模式
不同的颜色格式表示的是各个分量占用的 BIT 数,比如 RGBA888 表示Red、Green、Blue、Alpha 通道各占 8BIT,每个像素占 32BIT(4字节)

YUV类型

YUV是一种颜色编码方法,是编译 true-color 颜色空间(color space)的种类,常使用在各个视频处理组件中; YUV在对照片或视频编码时,考虑到人类的感知能力,允许降低色度的带宽。其中的**“Y”**表示明亮度,也就是灰阶值,即黑到白的范围值,所以只有Y值的图像是黑白的,U表示色彩值,V表示色彩的饱和度,UV用于指定像素的颜色

YUV类型汇总

YUV格式按照存储方法可以分为下面两类:

  • 平面格式 (planar formats
    将Y、U、V的三个分量分别存放在不同的存储空间中,先连续存储所有像素点的Y,紧接着存储所有像素点的U,随后是所有像素点的V

  • 紧缩格式 (packed formats
    将Y、U、V值按照像素存储在相同的存储空间,和RGB的存放方式类似,每个像素点的Y,U,V是连续交替存储的
    按照采样方式的不同,分为下面几种类型
    YUV4:4:4 表示完全取样。
    YUV4:2:2 表示2:1的水平取样,垂直完全采样。
    YUV4:2:0 表示2:1的水平取样,垂直2:1采样。

YUV444类型

每个像素点都存储对应的 YUV 值,注意 444 不是代表每个分量的字节数;YUV 每个分量都需要占用一个字节(8bit)
所以,在1080x1920的图像中,需要1080x1920x(1Y + 1U + 1V(字节)来存储
YUV 444 格式在屏幕上分布如下图所示:
YUV444.png

YUV422类型

每两个相邻像素点共用一对UV值,所以在1080x1920的图像中,需要1080x1920x(1Y+ 0.5U + 0.5V)(字节)来存储
YUV422格式在屏幕上分布如下图所示:
(所以 YUV422 类型所占字节数是 RGB/YUV444 类型的 2/3)
YUV422.png

YUV422 存储格式:

  • YUYV packed
    YUYV.png

  • YVYU packed
    YVYU.png

  • YU16、I422
    YU16.png

  • YV16
    YV16.png

YUV420类型

每四个相邻像素点共用一对UV 值,相当于每个Y只占用0.25U0.25V,在1080x1920的图像中,需要1080x1920x(1Y+ 0.25U + 0.25V)(字节)来存储
(YUV420 占用的大小是 RGB/YUV444 类型的一半,YUV420 类型可以概括为 UV 分量两行变一行,一行变一半)
YUV422 格式在屏幕上分布如下图所示:
YUV420.jpg

YU12(I420)、YV12
YU12-YV12.png

NV12 NV21
NV12-NV21.png

参考实例

这里将 RGB 类型转换为 YUV类型,展示了 YUV 类型的生成方法,注意:YUV 类型的宽高必须为偶数

void yuvImage::rgb2yuv(uint8_t r, uint8_t g, uint8_t b, uint8_t& y, uint8_t& u, uint8_t&v) {float y1 = 0.299*r + 0.587*g + 0.114*b;float u1 = -0.169*r - 0.331*g + 0.5*b + 128;float v1 = 0.5*r - 0.419*g - 0.081*b + 128;y = static_cast<uint8_t>(std::round(clamp(y1, 0.0f, 255.0f)));u = static_cast<uint8_t>(std::round(clamp(u1, 0.0f, 255.0f)));v = static_cast<uint8_t>(std::round(clamp(v1, 0.0f, 255.0f)));
}void yuvImage::rgb2nv12() {for(int y = 0; y < height; ++y) {for(int x = 0; x < width; ++x) {int idx = (height -1 -y)*width + x;int rgbidx = idx*3;uint8_t r = pixels[rgbidx+2];uint8_t g = pixels[rgbidx+1];uint8_t b = pixels[rgbidx];uint8_t yVal,uVal,vVal;rgb2yuv(r, g, b, yVal, uVal, vVal);yplane[y*width + x] = yVal;if(y%2 == 0 && x%2 == 0) {int uvIdx = (y/2)*(width/2) + x/2;uvplane[uvIdx*2] = uVal;uvplane[uvIdx*2+1] = vVal;}}}
}void yuvImage::save(const std::string& filename) {std::ofstream outFile(filename, std::ios::binary);if(!outFile.is_open()) {std::cerr << "fail to constuct file. " << std::endl;}outFile.write(reinterpret_cast<char*>(yplane.data()), yplane.size());outFile.write(reinterpret_cast<char*>(uvplane.data()), uvplane.size());std::cout << "save nv12 file " << filename << " success!." << std::endl;
}

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

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

相关文章

CentOS7.9安装OpenSSL 1.1.1t和OpenSSH9.9p1

一、临时开启telnet登录方式&#xff0c;避免升级失败无法登录系统 &#xff08;注意telnet登录方式存在安全隐患&#xff0c;升级openssh相关服务后要记得关闭&#xff09; 1.安装telnet服务 yum -y install xinetd telnet* 2.允许root用户通过telnet登陆&#xff0c;编辑…

使用DCI和RTIT技术进行精准调优--看录像

使用DCI和RTIT技术进行精准调优_哔哩哔哩_bilibili 每次看录像都记录一下。 PT/RTIT简介 DCI技术即通过USB3.0接口去访问调试目标机的JTAG组件&#xff0c;凡是运行在CPU上的代码均可以进行调试&#xff0c;这就没有了使用WinDBG调试时&#xff0c;会出现的不能调试敏感代码…

从MCP基础到FastMCP实战应用

MCP(https://github.com/modelcontextprotocol) MCP&#xff08;模型上下文协议&#xff09; 是一种专为 基于LLM的工具调用外部工具而设计的协议 &#xff0c; 本质上是 LLM ↔ 工具之间的RPC&#xff08;远程过程调用&#xff09; 的一种安全且一致的处理方式&#xff0c; 是…

深入理解C语言中的整形提升与算术转换

深入理解C语言中的整形提升与算术转换 一.整形提升&#xff1a;概念与原理 在C语言中&#xff0c;整形提升&#xff08;Integer Promotion&#xff09;是一个重要但容易被忽视的概念。它指的是在表达式中&#xff0c;任何小于int类型的整型&#xff08;如char、short&#xf…

编程题python常用技巧-持续

1.字典 1.1排序 在Python中&#xff0c;要按照字典的值进行排序&#xff0c;可以按照以下步骤操作&#xff1a; 方法说明 ‌获取键值对列表‌&#xff1a;使用 dict.items() 获取字典的键值对视图。‌排序键值对‌&#xff1a;使用 sorted() 函数&#xff0c;并通过 key 参…

硬件工程师面试常见问题(11)

第五十一问&#xff1a;器件手册的翻译题目 要学英语啊&#xff0c;孩子。 第五十二问&#xff1a;二极管三极管常识题 1.二极管的导通电压一般是 0.7V 2.MOS管根据掺杂类型可以分为 NMOS和PMOS 3.晶体三极管在工作时,发射结和集电结均处于正向偏置,该晶体管工作在一饱和态。…

mysql 配置文件中的[client]、[mysqld]、[mysqldump]和[mysql]区块的作用区别

1. [client] 区块 作用&#xff1a; 适用于 所有 MySQL 客户端工具&#xff08;如 mysql 命令行客户端、mysqldump、mysqladmin 等&#xff09;。 常见配置项&#xff1a; [client] host 127.0.0.1 # 默认连接的服务器地址 port 3306 # 默认端口 user root …

SARSA 算法详解:python从零实现

喜欢可以订阅专栏哟 第一章 强化学习基础与核心概念 1.1 强化学习的定义与特点 强化学习(Reinforcement Learning, RL)是机器学习三大范式之一(监督学习、无监督学习、强化学习),其核心思想是通过智能体(Agent)与环境(Environment)的持续交互来学习最优策略。与监督…

(C题|社交媒体平台用户分析问题)2025年第二十二届五一数学建模竞赛(五一杯/五一赛)解题思路|完整代码论文集合

我是Tina表姐&#xff0c;毕业于中国人民大学&#xff0c;对数学建模的热爱让我在这一领域深耕多年。我的建模思路已经帮助了百余位学习者和参赛者在数学建模的道路上取得了显著的进步和成就。现在&#xff0c;我将这份宝贵的经验和知识凝练成一份全面的解题思路与代码论文集合…

AI重塑SEO关键词策略

内容概要 传统SEO策略主要依赖人工经验与基础工具进行关键词布局&#xff0c;存在效率低、覆盖维度单一等痛点。而AI技术的介入&#xff0c;使关键词优化从静态词库匹配转向动态语义网络构建。通过自然语言处理&#xff08;NLP&#xff09;与深度学习模型&#xff0c;AI不仅能…

【Unity】 组件库分类详解

1️⃣ Audio&#xff08;音频组件&#xff09; 用于处理游戏中的声音。 Audio Source 读音[ˈɔːdiəʊ ˈsɔːs]&#xff0c;音频源组件&#xff0c;用于播放音频文件&#xff0c;可设置音量、Pitch、循环播放等属性&#xff0c;是音频播放的核心组件。 Audio Listener 读音…

【区块链】区块链技术介绍

引言 区块链技术自2008年中本聪提出比特币概念以来&#xff0c;逐渐从加密货币的底层技术演变为一场颠覆传统信任机制的全球性革命。它不仅重塑了金融体系&#xff0c;更在物流、医疗、政务等领域展现出巨大潜力。本文将用通俗易懂的语言&#xff0c;结合实例与原理&#xff0c…

MySQL零基础入门:Ubuntu环境安装与操作精解

知识点1【数据库】 数据的存储方式&#xff0c;我们之前学的&#xff0c;从变量&#xff0c;数组&#xff0c;链表&#xff0c;最后到文件&#xff0c;文件之上&#xff0c;便是数据库&#xff0c;而我们要介绍的MySQL就是数据库的关系数据库中的其中一种。 1、数据库 本质&…

力扣——23合并升序链表

目录 1:题目描述&#xff1a; 2.算法思想&#xff1a; 3.代码展示&#xff1a; 1:题目描述&#xff1a; 给你一个链表数组&#xff0c;每个链表都已经按升序排列。 请你将所有链表合并到一个升序链表中&#xff0c;返回合并后的链表。 示例 1&#xff1a; 输入&#xff…

AI重构危化品进口清关:一场效率与安全的双重革命

在全球化工产业链深度捆绑的今天&#xff0c;每年超过3亿吨危险化学品通过中国各大口岸流入国内市场。这些支撑着新能源电池、半导体材料等战略产业的“工业血液”&#xff0c;其进口清关流程却长期困于效率与安全的两难困境&#xff1a;人工审核单据平均耗时72小时&#xff0c…

牛客网题解 | 栈的压入、弹出序列

栈的压入、弹出序列 一、题目链接二、题目三、算法原理&#xff1a;用一个栈模拟入栈出栈的过程四、编写代码 一、题目链接 栈的压入、弹出序列 二、题目 三、算法原理&#xff1a;用一个栈模拟入栈出栈的过程 思路&#xff1a;用一个栈模拟入栈出栈的过程&#xff0c;模拟出…

使用CubeMX新建DMA工程——存储器到存储器模式

目录 1、新建板级支持包 2、修改main.c 3、程序流程 4、问题 新建工程的基本操作步骤参考这里&#xff1a; 【【野火】STM32 HAL库开发实战指南 教学视频 手把手教学STM32全系列 零基础入门CubeMXHAL库&#xff0c;基于野火全系列STM32开发板】 https://www.bilibili.com/…

HTML5 新增的主要标签整理

一、语义化标签&#xff08;让网页结构更清晰&#xff09; 1. <header> 和 <footer> 定义&#xff1a;表示网页的「顶部区域」和「底部区域」。场景&#xff1a; <header>&#xff1a;放 Logo、导航栏、搜索框。<footer>&#xff1a;放版权信息、联系…

Mysql数据库高可用解决方案-Mysql Router

目录 一.MySQL Router介绍 1. 什么是 MySQL Router&#xff1f; 2. MySQL Router 的主要用途 3. MySQL Router 的工作原理 4. MySQL Router 的核心组件 5. MySQL Router 的部署和配置 6. MySQL Router 的优势 7. 注意事项 8. MySQL Router 与其他工具的对比 9. 总结 …

【学习笔记】机器学习(Machine Learning) | 第六周|过拟合问题

机器学习&#xff08;Machine Learning&#xff09; 简要声明 基于吴恩达教授(Andrew Ng)课程视频 BiliBili课程资源 文章目录 机器学习&#xff08;Machine Learning&#xff09;简要声明 摘要过拟合与欠拟合问题一、回归问题中的过拟合1. 欠拟合&#xff08;Underfit&#x…