当前位置: 首页 > article >正文

颜色空间转换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.1687R0.3313G+0.5BCr=0.5R0.4187G0.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

注释

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.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 = 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.kler.cn/a/15895.html

相关文章:

  • C++中特殊类设计/单例模式
  • K8S containerd拉取harbor镜像
  • 黑马嵌入式开发入门模电基础学习笔记
  • 【重生之我要苦学C语言】深入理解指针6
  • [Mysql] Mysql的多表查询----多表关系(上)
  • 解决failed to execute PosixPath(‘dot‘) 或者GraphViz‘s executables not found
  • 软考(中/高级)高频考点——进度管理
  • 【五一创作】mongoDB的应用场景以及Spring和mongodb的整合
  • 【LLM】离线部署ChatGLM-6B模型
  • 深度学习笔记之稀疏自编码器
  • MongoDB安装
  • [大家的项目] 获取主机IP地址
  • PAT A1019 General Palindromic Number
  • 阿里云国际版ACE与国内版ACE区别
  • 百万赞同:网络安全为什么缺人? 缺什么样的人?
  • 计算机视觉毕业后找不到工作怎么办?怒刷leetcode,还是另寻他路?
  • 界面控件DevExpress WinForm的垂直网格,让数据展示更灵活(二)
  • EBS R12.1 注册客户化应用的步骤
  • AlgoC++第八课:手写BP
  • “华为杯”第十七届中国研究生 数学建模竞赛-【华为杯】D题:无人机集群协同对抗(附优秀论文及python代码实现)
  • Redis常见问题/应用场景/面试题总结(含答案)
  • seurat -- 关于DE gene的讨论
  • vue性能优化之虚拟列表滚动
  • 第七章 单行函数
  • 荔枝派Zero(全志V3S)驱动开发之串口
  • 使用docker部署prometheus最新版本2.43.0