Skip to content

Commit e113866

Browse files
committed
Add RGB2YDbDr.cpp
1 parent c6e680c commit e113866

File tree

2 files changed

+87
-1
lines changed

2 files changed

+87
-1
lines changed

Color Space Conversion/README.md

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,4 +3,5 @@
33
- RGBYUV.cpp C++实现RGB和YUV色彩空间相互转换算法。原理请看:https://blog.csdn.net/just_sort/article/details/87102898
44
- RGBHSV.cpp C++实现RGB和HSV色彩空间相互转换算法。原理请看:https://blog.csdn.net/just_sort/article/details/87102898
55
- RGBHSI.cpp C++实现RGB和HSI色彩空间相互转换算法。原理请看:https://blog.csdn.net/just_sort/article/details/87102898
6-
- RGBYCbCr.cpp C++实现了RGB和YCbCr色彩空间的相互转换算法。原理请看:https://blog.csdn.net/just_sort/article/details/87102898
6+
- RGBYCbCr.cpp C++实现了RGB和YCbCr色彩空间的相互转换算法。原理请看:https://blog.csdn.net/just_sort/article/details/87102898
7+
- RGB2YDbDr.cpp C++实现了RGB和YDbDr色彩空间的相互转换算法。原理请看:https://blog.csdn.net/just_sort/article/details/87102898

Color Space Conversion/RGB2YDbDr.cpp

Lines changed: 85 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,85 @@
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

Comments
 (0)