RGB与YCBCR转换及代码

一:目的意义

       在某些图像、视频中,经过一些图像处理之后,计算机对于处理后的图像仍然不能直白的检测出所需要的信息,这时候需要对某类色彩进行处理,使得所需要的信息更能直观的在处理后的图像显示出来。

二:RGB、YCBCR简介及公式转化

RGB:R:red(红色通道);G:green(绿色通道);B:blue(蓝色通道),三种颜色的叠加可以得到人类视力所能感知的所有颜色。

YCBCR:Y表示颜色的明亮度和浓度,也可叫灰度阶。(通过RGB转换YCBCR提取Y分量也可以得到灰度图像)

Cb:表示颜色的蓝色浓度偏移量即RGB输入信号蓝色部分与RGB信号亮度值之间的差异。

Cr:表示颜色的红色浓度偏移量即RGB输入信号红色部分与RGB信号亮度值之间的差异。

二者转换,可以将亮度和色度分离开,更直白的看到自己所需要图像。

二者相互转换公式:

    1、RGB转YCBCR

        Y=0.257*R+0.564*G+0.098*B+16

        Cb=-0.148*R-0.291*G+0.439*B+128

        Cr=0.439*R-0.368*G-0.071*B+128

     2、YCBCR转RGB

        R=1.164*(Y-16)+1.596*(Cr-128)

        G=1.164*(Y-16)-0.392*(Cb-128)-0.813*(Cr-128)

        B=1.164*(Y-16)+2.017*(Cb-128)

       

三:代码及运行效果 

import numpy as np #存储处理大型矩阵
import imageio
import matplotlib.pyplot as plt # plt 用于显示图片
import cv2
lena = imageio.imread("lena.jpg")

plt.subplot(131)
plt.imshow(lena) # 显示图片
plt.axis('on') # 显示坐标轴


def rgb2ycbcr(rgb_image):
    """convert rgb into ycbcr"""
    if len(rgb_image.shape)!=3 or rgb_image.shape[2]!=3:
        raise ValueError("input image is not a rgb image")
    rgb_image = rgb_image.astype(np.float32)
    # 1:创建变换矩阵,和偏移量
    transform_matrix = np.array([[0.257, 0.564, 0.098],
                                 [-0.148, -0.291, 0.439],
                                 [0.439, -0.368, -0.071]])
    shift_matrix = np.array([16, 128, 128])
    ycbcr_image = np.zeros(shape=rgb_image.shape)
    w, h, _ = rgb_image.shape
    # 2:遍历每个像素点的三个通道进行变换
    for i in range(w):
        for j in range(h):
            ycbcr_image[i, j, :] = np.dot(transform_matrix, rgb_image[i, j, :]) + shift_matrix
    return ycbcr_image

#opencv标准库的转换效果
ycrcb_image = cv2.cvtColor(lena, cv2.COLOR_RGB2YCR_CB)

lena_1 = rgb2ycbcr(lena)
plt.subplot(132)
plt.imshow(lena_1.astype(np.uint8)) # 显示图片
plt.axis('on') # 不显示坐标轴
plt.subplot(133)
plt.imshow(ycrcb_image)
plt.axis('on') # 显示坐标轴
plt.show()

左一为RGB原图,中间是转换为YCBCR的图像,

右一是通过opencv提供的标准库效果转换为YCRCB的图像

用公式计算转换的ycbcr图像与opencv标准库效果转换的图像基本一致,可以将上述代码矩阵的第二行与第三行换一下位置即可。

 四、参考

 RGB与YCBCR颜色空间转换及python实现_Mortal's blog-CSDN博客

  • 8
    点赞
  • 57
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值