1
+ const float YDbDrYRF = 0 .299F ; // RGB转YDbDr的系数(浮点类型)
2
+ const float YDbDrYGF = 0 .587F ;
3
+ const float YDbDrYBF = 0 .114F ;
4
+ const float YDbDrDbRF = -0 .1688F ;
5
+ const float YDbDrDbGF = -0 .3312F ;
6
+ const float YDbDrDbBF = 0 .5F ;
7
+ const float YDbDrDrRF = -0 .5F ;
8
+ const float YDbDrDrGF = 0 .4186F ;
9
+ const float YDbDrDrBF = 0 .0814F ;
10
+
11
+ const float RGBRYF = 1 .00000F ; // YDbDr转RGB的系数(浮点类型)
12
+ const float RGBRDbF = 0 .0002460817072494899F ;
13
+ const float RGBRDrF = -1 .402083073344533F ;
14
+ const float RGBGYF = 1 .00000F ;
15
+ const float RGBGDbF = -0 .344268308442098F ;
16
+ const float RGBGDrF = 0 .714219609001458F ;
17
+ const float RGBBYF = 1 .00000F ;
18
+ const float RGBBDbF = 1 .772034373903893F ;
19
+ const float RGBBDrF = 0 .0002111539810593343F ;
20
+
21
+ const int Shift = 20 ;
22
+ const int HalfShiftValue = 1 << (Shift - 1 );
23
+
24
+ const int YDbDrYRI = (int )(YDbDrYRF * (1 << Shift) + 0.5 ); // RGB转YDbDr的系数(整数类型)
25
+ const int YDbDrYGI = (int )(YDbDrYGF * (1 << Shift) + 0.5 );
26
+ const int YDbDrYBI = (int )(YDbDrYBF * (1 << Shift) + 0.5 );
27
+ const int YDbDrDbRI = (int )(YDbDrDbRF * (1 << Shift) + 0.5 );
28
+ const int YDbDrDbGI = (int )(YDbDrDbGF * (1 << Shift) + 0.5 );
29
+ const int YDbDrDbBI = (int )(YDbDrDbBF * (1 << Shift) + 0.5 );
30
+ const int YDbDrDrRI = (int )(YDbDrDrRF * (1 << Shift) + 0.5 );
31
+ const int YDbDrDrGI = (int )(YDbDrDrGF * (1 << Shift) + 0.5 );
32
+ const int YDbDrDrBI = (int )(YDbDrDrBF * (1 << Shift) + 0.5 );
33
+
34
+ const int RGBRYI = (int )(RGBRYF * (1 << Shift) + 0.5 ); // YDbDr转RGB的系数(整数类型)
35
+ const int RGBRDbI = (int )(RGBRDbF * (1 << Shift) + 0.5 );
36
+ const int RGBRDrI = (int )(RGBRDrF * (1 << Shift) + 0.5 );
37
+ const int RGBGYI = (int )(RGBGYF * (1 << Shift) + 0.5 );
38
+ const int RGBGDbI = (int )(RGBGDbF * (1 << Shift) + 0.5 );
39
+ const int RGBGDrI = (int )(RGBGDrF * (1 << Shift) + 0.5 );
40
+ const int RGBBYI = (int )(RGBBYF * (1 << Shift) + 0.5 );
41
+ const int RGBBDbI = (int )(RGBBDbF * (1 << Shift) + 0.5 );
42
+ const int RGBBDrI = (int )(RGBBDrF * (1 << Shift) + 0.5 );
43
+
44
+ Mat RGB2YDbDr (Mat src) {
45
+ int row = src.rows ;
46
+ int col = src.cols ;
47
+ Mat dst (row, col, CV_8UC3);
48
+ for (int i = 0 ; i < row; i++) {
49
+ for (int j = 0 ; j < col; j++) {
50
+ int Blue = src.at <Vec3b>(i, j)[0 ];
51
+ int Green = src.at <Vec3b>(i, j)[1 ];
52
+ int Red = src.at <Vec3b>(i, j)[2 ];
53
+ dst.at <Vec3b>(i, j)[0 ] = (uchar)((YDbDrYRI * Red + YDbDrYGI * Green + YDbDrYBI * Blue + HalfShiftValue) >> Shift);
54
+ dst.at <Vec3b>(i, j)[1 ] = (uchar)(128 + ((YDbDrDbRI * Red + YDbDrDbGI * Green + YDbDrDbBI * Blue + HalfShiftValue) >> Shift));
55
+ dst.at <Vec3b>(i, j)[2 ] = (uchar)(128 + ((YDbDrDrRI * Red + YDbDrDrGI * Green + YDbDrDrBI * Blue + HalfShiftValue) >> Shift));
56
+ }
57
+ }
58
+ return dst;
59
+ }
60
+
61
+ Mat YDbDr2RGB (Mat src) {
62
+ int row = src.rows ;
63
+ int col = src.cols ;
64
+ Mat dst (row, col, CV_8UC3);
65
+ for (int i = 0 ; i < row; i++) {
66
+ for (int j = 0 ; j < col; j++) {
67
+ int Y = src.at <Vec3b>(i, j)[0 ];
68
+ int Db = src.at <Vec3b>(i, j)[1 ] - 128 ;
69
+ int Dr = src.at <Vec3b>(i, j)[2 ] - 128 ;
70
+ int Red = Y + ((RGBRDbI * Db + RGBRDrI * Dr + HalfShiftValue) >> Shift);
71
+ int Green = Y + ((RGBGDbI * Db + RGBGDrI * Dr + HalfShiftValue) >> Shift);
72
+ int Blue = Y + ((RGBBDbI * Db + RGBBDrI * Dr + HalfShiftValue) >> Shift);
73
+ if (Red > 255 ) Red = 255 ;
74
+ else if (Red < 0 ) Red = 0 ;
75
+ if (Green > 255 ) Green = 255 ;
76
+ else if (Green < 0 ) Green = 0 ;
77
+ if (Blue > 255 ) Blue = 0 ;
78
+ else if (Blue < 0 ) Blue = 0 ;
79
+ dst.at <Vec3b>(i, j)[0 ] = Blue;
80
+ dst.at <Vec3b>(i, j)[1 ] = Green;
81
+ dst.at <Vec3b>(i, j)[2 ] = Red;
82
+ }
83
+ }
84
+ return dst;
85
+ }
0 commit comments