private void Rgb2Yuv(Image<Bgr, Byte> img, Image<Gray, double> yImg, Image<Gray, double> uImg, Image<Gray, double> vImg)
{
// Y= 0.3*R + 0.59*G + 0.11*B
// U= (B-Y) * 0.493
// V= (R-Y) * 0.877
double Y = 0.0, U = 0.0, V = 0.0;
for (int h = 0; h < img.Height; ++h)
{
for (int w = 0; w < img.Width; ++w)
{
//Y = 0.11 * img.Data[h, w, 0] + 0.59 * img.Data[h, w, 1] + 0.3 * img.Data[h, w, 2];
//U = (img.Data[h, w, 0] - Y) * 0.493;
//V = (img.Data[h, w, 2] - Y) * 0.877;
Y = 0.257 * img.Data[h, w, 0] + 0.504 * img.Data[h, w, 1] + 0.098 * img.Data[h, w, 2] + 16;
U = 0.148 * img.Data[h, w, 0] - 0.291 * img.Data[h, w, 1] + 0.439 * img.Data[h, w, 2] + 128;
V = 0.439 * img.Data[h, w, 0] - 0.368 * img.Data[h, w, 1] - 0.071 * img.Data[h, w, 2] + 128;
yImg.Data[h, w, 0] = Y;
uImg.Data[h, w, 0] = U;
vImg.Data[h, w, 0] = V;
}
}
}
//Y = 0.257R + 0.504G + 0.098B + 16
//U = 0.148R - 0.291G + 0.439B + 128
//V = 0.439R - 0.368G - 0.071B + 128
//B = 1.164(Y - 16) + 2.018(U - 128)
//G = 1.164(Y - 16) - 0.813(V - 128) - 0.391(U - 128)
//R = 1.164(Y - 16) + 1.596(V - 128)
private void Yuv2Rgb(Image<Gray, double> yImg, Image<Gray, double> uImg, Image<Gray, double> vImg, Image<Bgr, Byte> img)
{
//R = Y + 1.4075 *(V-128)
// G = Y – 0.3455 *(U –128) – 0.7169 *(V –128)
// B = Y + 1.779 *(U – 128)
double Y = 0.0, U = 0.0, V = 0.0;
for (int h = 0; h < img.Height; ++h)
{
for (int w = 0; w < img.Width; ++w)
{
Y = yImg.Data[h, w, 0];
U = uImg.Data[h, w, 0];
V = vImg.Data[h, w, 0];
//byte R = (byte)(Y + 1.4075 *(V-mid));
//byte G = (byte)(Y-0.3455 *(U-mid)-0.7169*(V-mid));
//byte B = (byte)(Y + 1.779 *(U-mid));
byte B = (byte)(1.164 * (Y - 16) + 2.018 * (U - 128));
byte G = (byte)(1.164 * (Y - 16) - 0.813 * (V - 128) - 0.391 * (U - 128));
byte R = (byte)(1.164 * (Y - 16) + 1.596 * (V - 128));
if (B > 255) B = 255;
if (B < 0) B = 0;
if (G > 255) G = 255;
if (G < 0) G = 0;
if (R > 255) R = 255;
if (R < 0) R = 0;
img.Data[h, w, 0] = B;
img.Data[h, w, 1] = G;
img.Data[h, w, 2] = R; ;
}
}
}
转载于:https://my.oschina.net/u/221120/blog/741516