颜色空间转换RGB-YCbCr
颜色空间
颜色空间(Color Space)是描述颜色的一种方式,它是一个由数学模型表示的三维空间,通常用于将数字表示的颜色转换成可见的颜色。颜色空间的不同取决于所选的坐标轴和原点,以及用于表示颜色的色彩模型。在计算机图形学和数字图像处理中,常用的颜色空间有RGB、CMYK、YUV、YCbCr、HSV等。
RGB、YUV、YCbCr、CMYK的区别
RGB、YUV、YCbCr是三种不同的颜色空间。
RGB颜色空间是将颜色分解为红、绿、蓝三原色,这是一种加色模型,常用于计算机图形学和显示设备上。在RGB颜色空间中,每个像素由红、绿、蓝三个通道组成。
YUV和YCbCr颜色空间是一种亮度-色度模型,主要用于视频信号的编码和传输。其中,Y表示亮度(Luma),U和V或Cb和Cr表示色度(Chroma)。
在YUV颜色空间中,亮度Y表示图像的亮度信息,色度U和V表示颜色信息。Y通道只包含亮度信息,U和V通道包含颜色信息。在YUV颜色空间中,对于一幅图像,只需要传输亮度信息Y,就可以保证图像的主要内容传输。色度信息U和V可以通过亮度信息Y来计算,从而实现压缩。
YCbCr颜色空间是YUV颜色空间的一种变体,常用于数字图像和视频处理中。YCbCr颜色空间中,Y通道和YUV颜色空间中的Y通道一样,表示亮度信息,Cb和Cr通道表示色度信息。与YUV不同的是,Cb和Cr通道都经过了一定程度的色度子采样,以减少图像数据的传输量和存储空间。
总之,RGB颜色空间用于计算机图形学和显示设备,YUV 主要用于电视广播和视频传输,而 YCbCr 主要用于数字图像和视频处理,包括压缩、编码、解码和显示等领域。
YCbCr与RGB的相互转换
RGB->YCbCr
RGB颜色空间转换成YCbCr颜色空间公式如下:
Y = 0.299 R + 0.587 G + 0.114 B C b = − 0.1687 R − 0.3313 G + 0.5 B C r = 0.5 R − 0.4187 G − 0.0813 B Y=0.299R+0.587G+0.114B\\ Cb=-0.1687R-0.3313G+0.5B\\ Cr=0.5R-0.4187G-0.0813B Y=0.299R+0.587G+0.114BCb=−0.1687R−0.3313G+0.5BCr=0.5R−0.4187G−0.0813B
YCbCr->RGB
R = Y + 1.402 C r G = Y − 0.344 C b − 0.714 C r B = Y + 1.772 C b R=Y+1.402Cr\\ G=Y-0.344Cb-0.714Cr\\ B=Y+1.772Cb R=Y+1.402CrG=Y−0.344Cb−0.714CrB=Y+1.772Cb
注释
Y通道代表亮度,其取值范围为0到255。而Cb和Cr通道代表色度,其取值范围为-128到127,在具体使用时通常需要加上128的偏移量,使其取值范围变为0到255,与Y通道一致。这样做的目的是方便数据传输和处理。所以有很多其他文章的RGB到YCbCr公式加了128,需要注意其中含义,不要混淆
测试代码
import matplotlib.pyplot as plt # plt 用于显示图片
import numpy as np
import cv2
import copy# ITU-R BT.601
# https://en.wikipedia.org/wiki/YCbCr
# RGB -> YCbCr
def rgb2ycbcr(rgb):m = np.array([[ 0.299, 0.587, 0.114],[-0.1687, -0.3313, 0.5],[ 0.5, -0.4187, -0.0813]])shape = rgb.shapeif len(shape) == 3:rgb = rgb.reshape((shape[0] * shape[1], 3))ycbcr = np.dot(rgb, m.transpose())return ycbcr.reshape(shape)# ITU-R BT.601
# https://en.wikipedia.org/wiki/YCbCr
# YUV -> RGB
def ycbcr2rgb(ycbcr):m = np.array([[ 1,0, 1.402],[1, -0.344, -0.714],[ 1, 1.772, 0]])shape = ycbcr.shapeif len(shape) == 3:ycbcr = ycbcr.reshape((shape[0] * shape[1], 3))rgb = np.dot(ycbcr, m.transpose())return rgb.reshape(shape)def main():#opencv的颜色通道顺序为[B,G,R],而matplotlib颜色通道顺序为[R,G,B],所以需要调换一下通道位置img1 = cv2.imread('./yuv.jpg')[:,:,(2,1,0)] # 读取和代码处于同一目录下的 yuv.jpgimg2=rgb2ycbcr(img1)#结果展示plt.rcParams['font.sans-serif'] = ['SimHei'] # 中文乱码plt.subplot(221)#imshow()对图像进行处理,画出图像,show()进行图像显示plt.imshow(img1)plt.title('RGB原图')#不显示坐标轴plt.axis('off')# print('原RGB图像')# print(img1)#子图2plt.subplot(222)img2=rgb2ycbcr(img1)#Cb分量赋值为0img2[:,:,1]=0#Cr分量赋值为0img2[:,:,2]=0#重新转成rgb图像img3=ycbcr2rgb(img2)# print('RGB-YCbCr图像')# print(img2)img3=img3.astype(np.uint8)plt.imshow(img3)plt.title('Y通道')plt.axis('off')#子图3plt.subplot(223)# print('YCbCr-RGB图像')# print(img3)img2=rgb2ycbcr(img1)#Y分量赋值为0img2[:,:,0]=0#Cr分量赋值为0img2[:,:,2]=0#重新转成rgb图像img4=ycbcr2rgb(img2)# print(img4)img4=img4.astype(np.uint8)# print(img3)plt.imshow(img4)plt.title('Cb通道')plt.axis('off')#子图4plt.subplot(224)img2=rgb2ycbcr(img1)#Y分量赋值为0img2[:,:,0]=0#Cb分量赋值为0img2[:,:,1]=0#重新转成rgb图像img5=ycbcr2rgb(img2)img5=img5.astype(np.uint8)plt.imshow(img5)plt.title('Cr通道')plt.axis('off')# #设置子图默认的间距plt.tight_layout()#显示图像plt.show()if __name__ =='__main__':main()
运行结果
原图片
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Yf5kBINs-1682659856502)(颜色空间转换RGB-YCbCr/yuv.jpg)]](https://img-blog.csdnimg.cn/016aff6926874d0b99320f3ad7c779f7.png)
转换结果

参考
[1] YCbCr
[2] jpeg图片格式详解
[3] RGB、YUV和HSV颜色空间模型
[4] RGB和YUV色彩模式
[5] YUV颜色编码格式
[6] 在Python中正确地将RGB转换成YCbCr
[7] JPEG算法解密
相关文章:
颜色空间转换RGB-YCbCr
颜色空间 颜色空间(Color Space)是描述颜色的一种方式,它是一个由数学模型表示的三维空间,通常用于将数字表示的颜色转换成可见的颜色。颜色空间的不同取决于所选的坐标轴和原点,以及用于表示颜色的色彩模型。在计算机…...
年薪40万程序员辞职炒股,把一年工资亏光了,得了抑郁症,太惨了
年薪40万的程序员辞职全职炒股 把一年的工资亏光了 得了抑郁症 刚才在网上看了一篇文章 是一位北京的一位在互联网 大厂上班的程序员 在去年就是股市行情比较好的时候 他买了30多万股票 结果连续三个月都赚钱 然后呢 他是就把每天就996这种工作就辞掉了 然后在家全是炒股 感觉炒…...
10分钟如何轻松掌握JMeter使用方法?
目录 引言 安装jmeter HTTP信息头管理器 JMeter断言 HTTP请求默认值来代替所有的域名与端口 JSON提取器来替换变量 结语 引言 想要了解网站或应用程序的性能极限,JMeter是一个不可或缺的工具。但是,对于初学者来说,该如何上手使用JMe…...
[NLP]如何训练自己的大型语言模型
简介 大型语言模型,如OpenAI的GPT-4或Google的PaLM,已经席卷了人工智能领域。然而,大多数公司目前没有能力训练这些模型,并且完全依赖于只有少数几家大型科技公司提供技术支持。 在Replit,我们投入了大量资源来建立从…...
LeetCode1047. 删除字符串中的所有相邻重复项
1047. 删除字符串中的所有相邻重复项 给出由小写字母组成的字符串 S,重复项删除操作会选择两个相邻且相同的字母,并删除它们。 在 S 上反复执行重复项删除操作,直到无法继续删除。 在完成所有重复项删除操作后返回最终的字符串。答案保证唯一…...
3。数据结构(3)
嵌入式软件开发第三部分,各类常用的数据结构及扩展,良好的数据结构选择是保证程序稳定运行的关键,(1)部分包括数组,链表,栈,队列。(2)部分包括树,…...
QT停靠窗口QDockWidget类
QT停靠窗口QDockWidget类 QDockWidget类简介函数和方法讲解 QDockWidget类简介 QDockWidget 类提供了一个部件,它可以停靠在 QMainWindow 内或作为桌面上的顶级窗口浮动。 QDockWidget 提供了停靠窗口部件的概念,也称为工具面板或实用程序窗口。 停靠窗…...
【LeetCode】139. 单词拆分
139. 单词拆分(中等) 思路 首先将大问题分解成小问题: 前 i 个字符的子串,能否分解成单词;剩余子串,是否为单个单词; 动态规划的四个步骤: 确定 dp 数组以及下标的含义 dp[i] 表示 s…...
【三维重建】NeRF原理+代码讲解
文章目录 一、技术原理1.概览2.基于神经辐射场(Neural Radiance Field)的体素渲染算法3.体素渲染算法4.位置信息编码(Positional encoding)5.多层级体素采样 二、代码讲解1.数据读入2.创建nerf1.计算焦距focal与其他设置2.get_emb…...
IntelliJ IDEA 社区版2021.3配置SpringBoot项目详细教程及错误解决方法
目录 一、SpringBoot的定义 二、Spring Boot 优点 三、创建一个springboot的项目 四、使用IDEA创建SpringBoot失败案例 一、SpringBoot的定义 Spring 的诞⽣是为了简化 Java 程序的开发的,⽽ Spring Boot 的诞⽣是为了简化 Spring 程序开发的。 Spring Boot 翻…...
Qt中QDebug的使用
QDebug类为调试信息(debugging information)提供输出流。它的声明在<QDebug>中,实现在Core模块中。将调试或跟踪信息(debugging or tracing information)写出到device, file, string or console时都会使用QDebug。 此类的成员函数参考:https://doc…...
vue使用路由的query配置项时如何清除地址栏的参数
写vue项目时,如果想通过路由的query配置项把参数从一个组件传到另一个组件,但是又不希望?idxxx显示在地址栏(如:http://localhost:8080/test?idxxx的?idxxx),该怎么做: 举一个案例࿱…...
Redis-列表(List)
Redis列表(List) 介绍 单键多值Redis 列表是简单的字符串列表,按照插入顺序排序。你可以添加一个元素到列表的头部(左边)或者尾部(右边)它的底层实际是个双向链表,对两端的操作性能很高,通过索…...
ripro主题修改教程-首页搜索框美化教程
先看效果图: 我们来看怎么实现: 1、找到wp-content/themes/ripro/assets/css/diy.css并将下面的内容整体复制进去并保存 /*首页搜索框*/ .bgcolor-fff {background-color: #fff; } .row,.navbar .menu-item-mega>.sub-menu{margin-left:-10px;margin-right:-10px;} .home…...
写作业用白光还是暖光?盘点色温4000K的护眼台灯
台灯的白光或者暖光指的是台灯的色温,低色温的光线看起来发黄发红,高色温的光线发白发蓝。 如果灯光的光源是高品质光源,本身没有蓝光问题,那么色温的选择对护眼的影响是比较少的,更多的是对人学习工作状态,…...
Java时间类(一)-- SimpleDateFormat类
目录 1. SimpleDateFormat的构造方法: 时间模式字母: 2. SimpleDateFormat的常用方法: “工欲善其事,必先利其器”。学习时间类之前,需要先学习SimpleDateFormat类。 java.text.SimpleDateFormat类是以与语言环境有关的方式来格式...
07 Kubernetes 网络与服务管理
课件 Kubernetes Service是一个抽象层,用于定义一组Pod的访问方式和访问策略,其作用是将一组Pod封装成一个服务,提供一个稳定的虚拟IP地址和端口号,以便于其他应用程序或服务进行访问。 以下是Kubernetes Service YAML配置文件的…...
并发编程之Atomic原子操作类
基本类型:AtomicInteger、AtomicBoolean、AtomicLong 引用类型:AtomicReference、AtomicMarkableReference、AtomicStampedReference 数组类型:AtomicIntegerArray、AtomicLongArray、AtomicReferenceArray 对象属性原子修改器:…...
管家婆辉煌Ⅱ 13.32版安装方法
因管家婆辉煌版已经长期不更新,现已经出现蓝屏的问题,故此新开此贴,慢慢更新安装方法。 首先管家婆下载地址:http://www.grasp.com.cn/download.aspx?id116 先安装sql server 2008 下载后,运行安装,请注…...
常见的接口优化技巧思路
一、背景 针对老项目,去年做了许多降本增效的事情,其中发现最多的就是接口耗时过长的问题,就集中搞了一次接口性能优化。本文将给小伙伴们分享一下接口优化的通用方案。 二、接口优化方案总结 1.批处理 批量思想:批量操作数据…...
Vim 调用外部命令学习笔记
Vim 外部命令集成完全指南 文章目录 Vim 外部命令集成完全指南核心概念理解命令语法解析语法对比 常用外部命令详解文本排序与去重文本筛选与搜索高级 grep 搜索技巧文本替换与编辑字符处理高级文本处理编程语言处理其他实用命令 范围操作示例指定行范围处理复合命令示例 实用技…...
业务系统对接大模型的基础方案:架构设计与关键步骤
业务系统对接大模型:架构设计与关键步骤 在当今数字化转型的浪潮中,大语言模型(LLM)已成为企业提升业务效率和创新能力的关键技术之一。将大模型集成到业务系统中,不仅可以优化用户体验,还能为业务决策提供…...
基于距离变化能量开销动态调整的WSN低功耗拓扑控制开销算法matlab仿真
目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.算法仿真参数 5.算法理论概述 6.参考文献 7.完整程序 1.程序功能描述 通过动态调整节点通信的能量开销,平衡网络负载,延长WSN生命周期。具体通过建立基于距离的能量消耗模型&am…...
从深圳崛起的“机器之眼”:赴港乐动机器人的万亿赛道赶考路
进入2025年以来,尽管围绕人形机器人、具身智能等机器人赛道的质疑声不断,但全球市场热度依然高涨,入局者持续增加。 以国内市场为例,天眼查专业版数据显示,截至5月底,我国现存在业、存续状态的机器人相关企…...
论文解读:交大港大上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(一)
宇树机器人多姿态起立控制强化学习框架论文解析 论文解读:交大&港大&上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(一) 论文解读:交大&港大&上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化…...
Hive 存储格式深度解析:从 TextFile 到 ORC,如何选对数据存储方案?
在大数据处理领域,Hive 作为 Hadoop 生态中重要的数据仓库工具,其存储格式的选择直接影响数据存储成本、查询效率和计算资源消耗。面对 TextFile、SequenceFile、Parquet、RCFile、ORC 等多种存储格式,很多开发者常常陷入选择困境。本文将从底…...
BLEU评分:机器翻译质量评估的黄金标准
BLEU评分:机器翻译质量评估的黄金标准 1. 引言 在自然语言处理(NLP)领域,衡量一个机器翻译模型的性能至关重要。BLEU (Bilingual Evaluation Understudy) 作为一种自动化评估指标,自2002年由IBM的Kishore Papineni等人提出以来,…...
【UE5 C++】通过文件对话框获取选择文件的路径
目录 效果 步骤 源码 效果 步骤 1. 在“xxx.Build.cs”中添加需要使用的模块 ,这里主要使用“DesktopPlatform”模块 2. 添加后闭UE编辑器,右键点击 .uproject 文件,选择 "Generate Visual Studio project files",重…...
绕过 Xcode?使用 Appuploader和主流工具实现 iOS 上架自动化
iOS 应用的发布流程一直是开发链路中最“苹果味”的环节:强依赖 Xcode、必须使用 macOS、各种证书和描述文件配置……对很多跨平台开发者来说,这一套流程并不友好。 特别是当你的项目主要在 Windows 或 Linux 下开发(例如 Flutter、React Na…...
基于单片机的宠物屋智能系统设计与实现(论文+源码)
本设计基于单片机的宠物屋智能系统核心是实现对宠物生活环境及状态的智能管理。系统以单片机为中枢,连接红外测温传感器,可实时精准捕捉宠物体温变化,以便及时发现健康异常;水位检测传感器时刻监测饮用水余量,防止宠物…...
