颜色空间转换RGB-YCbCr

news2024/11/27 16:48:28

颜色空间

RGB、YUV和YCbCr都是人为规定的彩色模型或颜色空间(有时也叫彩色系统或彩色空间)。它的用途是在某些标准下用通常可接受的方式对彩色加以说明。本质上,彩色模型是坐标系统和子空间的阐述。

YCbCr与RGB的相互转换

RGB->YCbCr

Y = 0.299 R + 0.587 G + 0.114 B C b = 0.564 ( B − Y ) = 0.564 ( − 0.299 R − 0.587 G + 0.886 B ) = − 0.1686 R − 0.3311 G + 0.4997 B C r = 0.713 ( R − Y ) = 0.713 ( 0.701 R − 0.587 G − 0.114 B ) = 0.4998 R − 0.4185 G − 0.0813 B Y=0.299R+0.587G+0.114B\\ Cb=0.564(B-Y)=0.564(-0.299R-0.587G+0.886B)=-0.1686R-0.3311G+0.4997B\\ Cr=0.713(R-Y)=0.713(0.701R-0.587G-0.114B)=0.4998R-0.4185G-0.0813B Y=0.299R+0.587G+0.114BCb=0.564(BY)=0.564(0.299R0.587G+0.886B)=0.1686R0.3311G+0.4997BCr=0.713(RY)=0.713(0.701R0.587G0.114B)=0.4998R0.4185G0.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=Y0.344Cb0.714CrB=Y+1.772Cb

测试代码

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.1686, -0.3311, 0.4997],
                  [ 0.4998, -0.4185, -0.0813]])
    shape = rgb.shape
    if 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.shape
    if len(shape) == 3:
        ycbcr = ycbcr.reshape((shape[0] * shape[1], 3))
    rgb = copy.deepcopy(ycbcr)
    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.jpg
  img2=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)

  #子图2
  plt.subplot(222)
  img2=rgb2ycbcr(img1)
  #Cb分量赋值为0
  img2[:,:,1]=0
  #Cr分量赋值为0
  img2[:,:,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')

  #子图3
  plt.subplot(223)
  # print('YCbCr-RGB图像')
  # print(img3)
  img2=rgb2ycbcr(img1)
  #Y分量赋值为0
  img2[:,:,0]=0
  #Cr分量赋值为0
  img2[:,:,2]=0
  #重新转成rgb图像
  img4=ycbcr2rgb(img2)
  # print(img4)
  img4=img4.astype(np.uint8)
  # print(img3)
  plt.imshow(img4)
  plt.title('Cb通道')
  plt.axis('off')

  #子图4
  plt.subplot(224)
  img2=rgb2ycbcr(img1)
  #Y分量赋值为0
  img2[:,:,0]=0
  #Cb分量赋值为0
  img2[:,:,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)]

转换结果

在这里插入图片描述

参考

[1] YCbCr

[2] jpeg图片格式详解

[3] RGB、YUV和HSV颜色空间模型

[4] RGB和YUV色彩模式

[5] YUV颜色编码格式

[6] 在Python中正确地将RGB转换成YCbCr

[7] JPEG算法解密

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

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

相关文章

2023五一杯数学建模竞赛ABC题思路解析+代码+论文

AB题见文末,下面是C C题:“双碳”目标下低碳建筑研究 “双碳”即碳达峰与碳中和的简称,我国力争2030年前实现碳达峰,2060年前实现碳中和。“双碳”战略倡导绿色、环保、低碳的生活方式。我国加快降低碳排放步伐,大力推…

金陵科技学院五年一贯制专转本电路分析考试大纲

金陵科技学院五年一贯制专转本电路分析考试大纲 专业名称:自动化 考试科目:专业基础课 一、考试要求 掌握电路分析的基本概念、基本原理和基本方法,提高分析电路的思维能力与计算能力,以便为学习后继课程奠定必要的基础。 二…

R 安装函数包及绘制图形

R语言绘制简单条形图 一、载入数据1.安装函数包2.导入文件3.读取数据(.csv文件) 二、绘制图形绘制简单条形图 一、载入数据 1.安装函数包 在控制台console输入命令: install.packages("bruceR")查看是否安装成功 library(bruce…

【二】MATLAB矩阵处理

【二】MATLAB矩阵处理 1 常用的特殊矩阵函数 zeros函数: zeros(m):产生mm零矩阵 zeros(m,n):产生mn零矩阵 zeros(size(A)):产生与矩阵A相同大小的零矩阵 ones函数: 产生4阶全1矩阵 ones(4) eye函数: 产生对角线为1的矩阵&#xff0c…

分享随机数和唯一ID的工具类

随机数一般也是会被常使用到的,比如在造一些模拟测试数据的场景,或者说是非高端应用的场景会被使用。而全局唯一ID的使用则相反,应用场景更广,更专业,更科学,比如在批量保存数据时,需要提前生成…

CVE漏洞复现-CVE-2016-10033-远程命令执行

CVE-2016-10033-远程命令执行 PHPMailer是一个基于PHP语言的邮件发送组件,被广泛运用于诸如WordPress、Drupal、1CRM、SugarCRM、Yii、Joomla等用户量巨大的应用与框架中。 CVE-2016-10033是PHPMailer中存在的高危漏洞,这个高危漏洞是由 class.phpmail…

Java 17 新特性尝鲜

JDK 17更新了包括14个特性,具体如下表所示: Restore Always-StrictFloating-Point Semantics 恢复始终严格模式(Always-Strict)的浮点语义EnhancedPseudo-Random Number Generators 增强型伪随机数生成器New macOS RenderingPipe…

Spring boot结合SkyWalking-Trace工具类实现日志打印请求链路traceid

背景: 随着业务的复杂化、解耦化,运维人员和开发人员需要对请求链路跟踪来快速发现和定位问题,基于应用已经集成了SkyWalking的前提下,如何通过获取SkyWalking生成的统一traceId并加入打印日志中,方便开发人员能够根据…

露营好物推荐:极米轻薄投影仪Z6X Pro

温度回升,春意萌动,很多人开始计划春游、露营,打算和家人、朋友一起享受大自然的春日场景。漫天星光下,吃着美食、喝着小酒,再加上一场露天电影,逃离了城市的喧嚣,在大自然中尽情撒野,又有谁会不喜欢呢?如今众多露营爱…

matlab 实现常用的混沌映射(Tent, Sine, Sinusoidal, Piecewise, Logistic, Cubic, Chebyshev)

大部分混沌映射的系数是有限制的, 针对每个模型最优的混沌系数是不一样的, 因此混沌系数要根据自己的模型来定. 下面的系数都是根据我自己的模型而设定的. 混沌映射 1 Tent 映射2 Sine 映射3 Sinusoidal 映射4 Piecewise 映射5 Logistic 映射6 Cubic 映射7 Chebyshev 映射 1 Te…

松下机器人进行数据备份与恢复的具体方法

松下机器人进行数据备份与恢复的具体方法 数据备份 如下图所示,找到备份选项,按确认, 如下图所示,选择保存,按确认键, 如下图所示,选择USB存储设备,选择存储路径,按确认键, 选择需要备份的数据,如下图所示,默认情况下是勾选“全部数据”, 如下图所示,显…

马云的创业故事及他人生中的摆渡人-卖掉中国黄页去北漂(五)

马云北上是在外经贸部一位名叫王建国的朋友牵线之下,受邀担任外经贸部下属的中国国际电子商务中心(下面简称EDI)总经理,负责搭建外经贸部官网和网上中国商品交易市场。 马云团队在潘家园租了房子,白天上班&#xff0c…

C++ + QT (不使用QT插件模式)的heic图片显示。

1.首先确定的是,要想C读取或者显示heic图片。光用ffmpeg没有heic的解码器。所以此时就要用上libheif了。通过查资料发现,一个比较常见的 C 解析解码 heic 格式图片的开源库是 libheif,而这个库对 h265 的解码过程又依赖于另一个开源 C 库 lib…

木牛科技发布高性价比的5R方案 助力智能驾驶的科技平权

从3月开始升温的车市价格战,蔓延到了4月上海车展,多款新车再次刷新了价格“下限”。随着价格战的白热化,车企们也开始反思,需要给消费者输出稳定的价值,价格需要回归到价值本身,而市场真正应该打响的是倡导…

【超全】在OAK深度AI相机上部署用户神经网络模型的三种方法

编辑:OAK中国 首发:oakchina.cn 喜欢的话,请多多👍⭐️✍ 内容可能会不定期更新,官网内容都是最新的,请查看首发地址链接。 ▌前言 Hello,大家好,这里是OAK中国,我是助手…

CDH Hive Metastore canary

现象:CDH平台突然报错,报错信息为:The Hive Metastore canary failed to create a database 排查一下两点都未发现问题: 检查hiveServer2日志(hadoop-cmf-hive-HIVEMETASTORE.log.out)无异常检查元数据依赖的数据库(我安装是mysql),无异常发现 于是在网上搜索,发现很有可能是…

【CMake】2. 使用CMake添加一个库

2. 使用CMake添加一个库 1. 什么是 library(库)? 库 函数库,所谓库,就是将函数封装成库来供我们使用,包含静态库和动态库。 对于代码到可执行程序的过程,这里简单复习一下: 源文…

TMM 22 | 像拆玩具一样的点云预训练

文章题目:Self-supervised Point Cloud Representation Learning via Separating Mixed Shapes 作者:Chao Sun, Zhedong Zheng, Xiaohan Wang, Mingliang Xu and Yi Yang 论文链接:https://www.zdzheng.xyz/files/TMM_3D_Pre_Training.pdf …

openGauss DBMind自治运维系统的安装和部署

目录 1、安装准备 1.1 环境信息 1.2 安装包 1.3 数据库用户 2、安装DBMind 3、部署DBMind 3.1 自动部署--推荐 手动配置--推荐 交互式配置 3.2 手动部署 规划配置 4、启动DBMind DBMind作为openGauss数据库的一部分,为openGauss数据库提供了自动驾驶能力…

react由用index作为key进行增删查改引发的问题

现象描述:添加小王在第一个元素,在li元素可以看出来,但是在后面的输入框小张的位置占用了。因为添加小王在第一个元素,它的key是0,旧的dom的key0是小张。所以校长被顶上去了。看到这个现象特意去学了react虚拟dom的dif…