Skip to content

Commit 104fa6c

Browse files
committed
Add RGBYCbCr.cpp
1 parent 06e35d5 commit 104fa6c

File tree

2 files changed

+84
-1
lines changed

2 files changed

+84
-1
lines changed

Color Space Conversion/README.md

+2-1
Original file line numberDiff line numberDiff line change
@@ -2,4 +2,5 @@
22
- RGB2GRAY.cpp C++实现并优化RGB转灰度图算法。原理请看:https://blog.csdn.net/just_sort/article/details/87102898
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
5-
- RGBHSI.cpp C++实现RGB和HSI色彩空间相互转换算法。原理请看:https://blog.csdn.net/just_sort/article/details/87102898
5+
- 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

Color Space Conversion/RGBYCbCr.cpp

+82
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,82 @@
1+
const float YCbCrYRF = 0.299F; // RGB转YCbCr的系数(浮点类型)
2+
const float YCbCrYGF = 0.587F;
3+
const float YCbCrYBF = 0.114F;
4+
const float YCbCrCbRF = -0.168736F;
5+
const float YCbCrCbGF = -0.331264F;
6+
const float YCbCrCbBF = 0.500000F;
7+
const float YCbCrCrRF = 0.500000F;
8+
const float YCbCrCrGF = -0.418688F;
9+
const float YCbCrCrBF = -0.081312F;
10+
11+
const float RGBRYF = 1.00000F; // YCbCr转RGB的系数(浮点类型)
12+
const float RGBRCbF = 0.0000F;
13+
const float RGBRCrF = 1.40200F;
14+
const float RGBGYF = 1.00000F;
15+
const float RGBGCbF = -0.34414F;
16+
const float RGBGCrF = -0.71414F;
17+
const float RGBBYF = 1.00000F;
18+
const float RGBBCbF = 1.77200F;
19+
const float RGBBCrF = 0.00000F;
20+
21+
const int Shift = 20;
22+
const int HalfShiftValue = 1 << (Shift - 1);
23+
24+
const int YCbCrYRI = (int)(YCbCrYRF * (1 << Shift) + 0.5); // RGB转YCbCr的系数(整数类型)
25+
const int YCbCrYGI = (int)(YCbCrYGF * (1 << Shift) + 0.5);
26+
const int YCbCrYBI = (int)(YCbCrYBF * (1 << Shift) + 0.5);
27+
const int YCbCrCbRI = (int)(YCbCrCbRF * (1 << Shift) + 0.5);
28+
const int YCbCrCbGI = (int)(YCbCrCbGF * (1 << Shift) + 0.5);
29+
const int YCbCrCbBI = (int)(YCbCrCbBF * (1 << Shift) + 0.5);
30+
const int YCbCrCrRI = (int)(YCbCrCrRF * (1 << Shift) + 0.5);
31+
const int YCbCrCrGI = (int)(YCbCrCrGF * (1 << Shift) + 0.5);
32+
const int YCbCrCrBI = (int)(YCbCrCrBF * (1 << Shift) + 0.5);
33+
34+
const int RGBRYI = (int)(RGBRYF * (1 << Shift) + 0.5); // YCbCr转RGB的系数(整数类型)
35+
const int RGBRCbI = (int)(RGBRCbF * (1 << Shift) + 0.5);
36+
const int RGBRCrI = (int)(RGBRCrF * (1 << Shift) + 0.5);
37+
const int RGBGYI = (int)(RGBGYF * (1 << Shift) + 0.5);
38+
const int RGBGCbI = (int)(RGBGCbF * (1 << Shift) + 0.5);
39+
const int RGBGCrI = (int)(RGBGCrF * (1 << Shift) + 0.5);
40+
const int RGBBYI = (int)(RGBBYF * (1 << Shift) + 0.5);
41+
const int RGBBCbI = (int)(RGBBCbF * (1 << Shift) + 0.5);
42+
const int RGBBCrI = (int)(RGBBCrF * (1 << Shift) + 0.5);
43+
44+
Mat RGB2YCbCr(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] = (int)((YCbCrYRI * Red + YCbCrYGI * Green + YCbCrYBI * Blue + HalfShiftValue) >> Shift);
54+
dst.at<Vec3b>(i, j)[1] = (int)(128 + ((YCbCrCbRI * Red + YCbCrCbGI * Green + YCbCrCbBI * Blue + HalfShiftValue) >> Shift));
55+
dst.at<Vec3b>(i, j)[2] = (int)(128 + ((YCbCrCrRI * Red + YCbCrCrGI * Green + YCbCrCrBI * Blue + HalfShiftValue) >> Shift));
56+
}
57+
}
58+
return dst;
59+
}
60+
61+
Mat YCbCr2RGB(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 Cb = src.at<Vec3b>(i, j)[1] - 128;
69+
int Cr = src.at<Vec3b>(i, j)[2] - 128;
70+
int Red = Y + ((RGBRCrI * Cr + HalfShiftValue) >> Shift);
71+
int Green = Y + ((RGBGCbI * Cb + RGBGCrI * Cr + HalfShiftValue) >> Shift);
72+
int Blue = Y + ((RGBBCbI * Cb + HalfShiftValue) >> Shift);
73+
if (Red > 255) Red = 255; else if (Red < 0) Red = 0;
74+
if (Green > 255) Green = 255; else if (Green < 0) Green = 0; // 编译后应该比三目运算符的效率高
75+
if (Blue > 255) Blue = 255; else if (Blue < 0) Blue = 0;
76+
dst.at<Vec3b>(i, j)[0] = Blue;
77+
dst.at<Vec3b>(i, j)[1] = Green;
78+
dst.at<Vec3b>(i, j)[2] = Red;
79+
}
80+
}
81+
return dst;
82+
}

0 commit comments

Comments
 (0)