RGB2YCbCr RGB2Gray

1、问题起因
        在学习工作中有时候因为色彩空间的不同,对图像处理的结果也会有所不同,因此需要对图像的色彩空间进行转换。对于火焰识别来说,色度对火焰的识别结果产生极大的影响,因此需要将RGB空间的色彩模式转换为YCbCr。

2、RGB和YCbCr色彩模式的不同
(1) RGB简介
RGB色彩模式是工业界的一种颜色标准,是通过对红(R)、绿(G)、蓝(B)三个颜色通道的变化以及它们相互之间的叠加来得到各式各样的颜色的,RGB即是代表红、绿、蓝三个通道的颜色,这个标准几乎包括了人类视力所能感知的所有颜色,是目前运用最广的颜色系统之一。

    R:红色通道(Red)

   G:绿色通道(Green)

   B:蓝色通道(Blue)

(2)YCbCr简介
       YCbCr或Y'CbCr有的时候会被写作:YCBCR或是Y'CBCR,是色彩空间的一种,通常会用于影片中的影像连续处理,或是数字摄影系统中。Y'为颜色的亮度(luma)成分、而CB和CR则为蓝色和红色的浓度偏移量成份。Y'和Y是不同的,而Y就是所谓的流明(luminance),表示光的浓度且为非线性,使用伽马修正(gamma correction)编码处理。

Y:明亮度,也就是灰阶值。“亮度”是透过RGB输入信号来建立的,方法是将RGB信号的特定部分叠加到一起。(Luminance或Luma,不要问我Luminance 为什么会简写为Y,我也不懂)

Cb:反映的是RGB输入信号蓝色部分与RGB信号亮度值之间的差异。ChrominanceBlue

Cr:反映了RGB输入信号红色部分与RGB信号亮度值之间的差异。ChrominanceRed

3、相互转换
(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)

Python

#方法一:利用skimage中的转换函数
from skimage import io as skio 
from skimage import color as skco
 
ima = skio.imread('abc.bmp')
ima_ycbcr = skimage.color.rgb2ycbcr(ima)
 
#方法二:利用公式计算
import matplotlib.image as mpimg
import numpy as np
 
ima = mpimg.imread('abc.bmp')
ima_r = im_l[:, :, 0]
ima_g = im_l[:, :, 1]
ima_b = im_l[:, :, 2]
################################################RGB2YCBCR
#获取亮度,即原图的灰度拷贝
ima_y = 0.256789 * ima_r + 0.504129 * ima_g + 0.097906 * ima_b + 16
#获取蓝色分量
ima_cb = -0.148223 * ima_r - 0.290992 * im_l_g + 0.439215 * ima_b + 128
#获取红色分量
ima_cr = 0.439215 * ima_r - 0.367789 * ima_g - 0.071426 * ima_b + 128
 
# 将三个分量合并在一起
ima_rgb2ycbcr = np.zeros(ima.shape)
ima_rgb2ycbcr[:,:,0] = ima_y
ima_rgb2ycbcr[:,:,1] = ima_cb
ima_rgb2ycbcr[:,:,2] = ima_cr
###############################################YCBCR2RGB
ima_ycbcr2rgb = np.zeros(ima.shape)
 
ima_ycbcr2rgb[:,:,0] = 1.164383 * (ima_y-16) + 1.596027 * (ima_cr-128)
ima_ycbcr2rgb[:,:,1] = 1.164383 * (ima_y-16) - 0.391762 * (ima_cb-128)- 0.812969 * (ima_cr-128)
ima_ycbcr2rgb[:,:,2] = 1.164383 * (ima_y-16) + 2.017230 * (ima_cb-128)

RGB2Gray

一、基础
  对于彩色转灰度,有一个很著名的心理学公式:

                          Gray = R*0.299 + G*0.587 + B*0.114

二、整数算法

  而实际应用时,希望避免低速的浮点运算,所以需要整数算法。
  注意到系数都是3位精度的没有,我们可以将它们缩放1000倍来实现整数运算算法:

                          Gray = (R*299 + G*587 + B*114 + 500) / 1000

  RGB一般是8位精度,现在缩放1000倍,所以上面的运算是32位整型的运算。注意后面那个除法是整数除法,所以需要加上500来实现四舍五入。
  就是由于该算法需要32位运算,所以该公式的另一个变种很流行:

                          Gray = (R*30 + G*59 + B*11 + 50) / 100

  但是,虽说上一个公式是32位整数运算,但是根据80x86体系的整数乘除指令的特点,是可以用16位整数乘除指令来运算的。而且现在32位早普及了(AMD64都出来了),所以推荐使用上一个公式。

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值