private void Rgb2Yuv(Imageimg, Image yImg, Image uImg, Image 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 yImg, Image uImg, Image vImg, Image 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; ; } } }