由于不同国家的电视信号系统支持的图像格式不同,有YUV格式成像,也有RGB格式成像,因此为了保证兼容性,需要进行RGB与YUV格式的互转。
另外YUV格式具有亮度信息和色彩信息分离的特点,但大多数图像处理操作都是基于RGB格式,需要将RGB格式转为YUV格式。而当图像进行后期显示时,又需要将YUV转换为RGB域。
d3d中shader转换矩阵:
float4x4 matr2y = {
0.299000f, -0.169000f, 0.500000f, 0.000000f,
0.587000f, -0.33100f, -0.419000f, 0.000000f,
0.114000f, 0.500000f, -0.081000f, 0.000000f,
0.000000f, 0.000000f, 0.000000f, 0.000000f };
将上述矩阵乘法展开,YUV(256 级别) 可以从8位 RGB 直接计算如下:
Y = 0.299 R + 0.587 G + 0.114 B
U = - 0.1687 R - 0.3313 G + 0.5 B + 128
V = 0.5 R - 0.4187 G - 0.0813 B + 128
D3D中shader转换矩阵:
float4x4 maty2r = {
1.000000f, 1.000000f, 1.000000f, 0.000000f,
0.000000f, -0.34414f, 1.177200f, 0.000000f,
1.402000f, -0.71414f, 0.000000f, 0.000000f,
0.000000f, 0.000000f, 0.000000f, 0.000000f };
将上述矩阵乘法展开,8位RGB可以从YUV(256级别) 直接计算如下:
R = Y + 1.402 (V-128)
G = Y - 0.34414 (U-128) - 0.71414 (V-128)
B = Y + 1.772 (U-128)
YCbCr格式是基于YUV格式的一个偏移,具体转换如下:
Y’ = 0.257*R' + 0.504*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
D3D中shader转换矩阵:
float4x4 matr2y = {
0.256788f, -0.148223f, 0.439216f, 0.000000f,
0.504129f, -0.290993f, -0.367788f, 0.000000f,
0.097906f, 0.439216f, -0.071427f, 0.000000f,
0.062745f, 0.500000f, 0.500000f, 0.000000f };
转换格式如下:
R' = 1.164*(Y’-16) + 1.596*(Cr'-128)
G' = 1.164*(Y’-16) - 0.813*(Cr'-128) -0.392*(Cb'-128)
B' = 1.164*(Y’-16) + 2.017*(Cb'-128)
推导出:
R' = 1.164*Y' + 1.596 * V' - 222.9
G' = 1.164*Y' - 0.392 * U' - 0.823 * V'+ 135.6
B' = 1.164*Y' + 2.017 * U'- 276.8
D3D中shader转换矩阵为:
float4x4 maty2r = {
1.164384f, 1.164384f, 1.164384f, 0.000000f,
0.000000f, -0.391762f, 2.017232f, 0.000000f,
1.596027f, -0.812968f, 0.000000f, 0.000000f,
-0.874202f, 0.531668f, -1.085631f, 0.000000f };