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)