logo资料库

实现RGB颜色空间到HSV和YCbCr颜色空间的转换.doc

第1页 / 共3页
第2页 / 共3页
第3页 / 共3页
资料共3页,全文预览结束
实现 RGB 颜色空间到 HSV 和 YCbCr 颜色空间的转换 1.实现 RGB 颜色空间到 HSV 颜色空间的转换 void Rgb2Hsv(float R, float G, float B, float& H, float& S, float&V) { // r,g,b values are from 0 to 1 // h = [0,360], s = [0,1], v = [0,1] // if s == 0, then h = -1 (undefined) float min, max, delta,tmp; tmp = min(R, G); min = min( tmp, B ); tmp = max( R, G); max = max(tmp, B ); V = max; // v delta = max - min; if( max != 0 ) S = delta / max; // s else { // r = g = b = 0 // s = 0, v is undefined S = 0; H = UNDEFINEDCOLOR; return; } if( R == max ) H = ( G - B ) / delta; // between yellow & magenta else if( G == max ) H = 2 + ( B - R ) / delta; // between cyan & yellow else H = 4 + ( R - G ) / delta; // between magenta & cyan H *= 60; // degrees if( H < 0 ) H += 360; } HSV 颜色空间转换为 RGB 空间颜色值: void Hsv2Rgb(float H, float S, float V, float &R, float &G, float &B) { int i; float f, p, q, t;
if( S == 0 ) { // achromatic (grey) R = G = B = V; return; } H /= 60; // sector 0 to 5 i = floor( H ); f = H - i; // factorial part of h p = V * ( 1 - S ); q = V * ( 1 - S * f ); t = V * ( 1 - S * ( 1 - f ) ); switch( i ) { case 0: R = V; G = t; B = p; break; case 1: R = q; G = V; B = p; break; case 2: R = p; G = V; B = t; break; case 3: R = p; G = q; B = V; break; case 4: R = t; G = p; B = V; break; default: // case 5: R = V; G = p; B = q;
break; } } 2.实现 RGB 颜色空间到 YCbCr 颜色空间的转换 RGB 转换为 YCbCr for(i =0 ; i < dest->dwSize; ) { UCHAR r,g,b; r = sBuf[i+0]; g = sBuf[i+1]; b = sBuf[i+2]; dBuf[i+0]= (unsigned char)(r * 0.256789 + g * 0.504129 + b * 0.097906)+ 16; dBuf[i+1]= (unsigned char)(r *-0.148223 + g * -0.290992 + b * 0.439215)+ 128; dBuf[i+2]= (unsigned char)(r * 0.439215 + g * -0.367789 + b *-0.071426)+ 128; i += 3; } YCbCr 转换为 RGB for(i =0 ; i < dest->dwSize; ) { UCHAR y,u,v; y = sBuf[i+0]; u = sBuf[i+1]; v = sBuf[i+2]; dBuf[i+0]= (unsigned char)(1.164383*(y- 16) + 0 + 1.596027*(v - 128)); dBuf[i+1]= (unsigned char)(1.164383*(y- 16) - 0.391762*(u - 128) - 0.812969*(v - 128)); dBuf[i+2]= (unsigned char)(1.164383*(y- 16) + 2.017230*(u - 128) + 0 ); i += 3; }
分享到:
收藏