有没有RGB转HSV的优化算法

LPR_Pro 2009-09-27 11:38:58
将RGB数据转换为HSV,我目前知道的转换方法在运行上效率比较低,有那位知道相关的优化算法,有思路就可以,代码实现更好!
谢谢各位!
...全文
814 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
stivenjia 2009-09-28
  • 打赏
  • 举报
回复


DWORD __stdcall HSV2RGB(COLORREF *dwColor,double dValH,double &dValS,double &dValV)
{
BYTE var_R = 0,var_G = 0,var_B = 0;
double var_h = 0.0;
int var_i = 0;
double var_1 = 0.0,var_2 = 0.0,var_3 = 0.0;
double var_r = 0.0,var_g = 0.0,var_b = 0.0;
if ( 0 < dValS && dValS < 0.0000001 ) //HSV from 0 to 1
{
var_R = dValV * 255;
var_G = dValV * 255;
var_B = dValV * 255;
}
else
{
var_h = dValH * 6;
if ( var_h == 6 ) var_h = 0; //H must be < 1
var_i = int( var_h ); //Or ... var_i = floor( var_h )
var_1 = dValV * ( 1 - dValS );
var_2 = dValV * ( 1 - dValS * ( var_h - var_i ) );
var_3 = dValV * ( 1 - dValS * ( 1 - ( var_h - var_i ) ) );

if( var_i == 0 ) { var_r = dValV ; var_g = var_3 ; var_b = var_1; }
else if ( var_i == 1 ) { var_r = var_2 ; var_g = dValV; var_b = var_1; }
else if ( var_i == 2 ) { var_r = var_1 ; var_g = dValV; var_b = var_3; }
else if ( var_i == 3 ) { var_r = var_1 ; var_g = var_2; var_b = dValV; }
else if ( var_i == 4 ) { var_r = var_3 ; var_g = var_1; var_b = dValV; }
else { var_r = dValV ; var_g = var_1; var_b = var_2; }

var_R = var_r * 255; //RGB results from 0 to 255
var_G = var_g * 255;
var_B = var_b * 255;
}
if(dwColor != NULL)
*dwColor = RGB(var_R,var_G,var_B);
return RGB(var_R,var_G,var_B);
}
stivenjia 2009-09-28
  • 打赏
  • 举报
回复


void __stdcall RGB2HSV(COLORREF dwColor,double &dValH,double &dValS,double &dValV)
{
double var_R = 0.0,var_G = 0.0,var_B = 0.0;
double del_R = 0.0,del_G = 0.0,del_B = 0.0;
double var_Min = 0.0,var_Max = 0.0,del_Max = 0.0;

var_R = ( GetRValue(dwColor) / 255 ); //RGB from 0 to 255
var_G = ( GetGValue(dwColor) / 255 );
var_B = ( GetBValue(dwColor) / 255 );

var_Min = min( var_R, var_G, var_B ); //Min. value of RGB
var_Max = max( var_R, var_G, var_B ); //Max. value of RGB
del_Max = var_Max - var_Min; //Delta RGB value

dValV = var_Max;

if ( del_Max == 0 ) //This is a gray, no chroma...
{
dValH = 0; //HSV results from 0 to 1
dValS = 0;
}
else //Chromatic data...
{
dValS = del_Max / var_Max;
del_R = ( ( ( var_Max - var_R ) / 6 ) + ( del_Max / 2 ) ) / del_Max;
del_G = ( ( ( var_Max - var_G ) / 6 ) + ( del_Max / 2 ) ) / del_Max;
del_B = ( ( ( var_Max - var_B ) / 6 ) + ( del_Max / 2 ) ) / del_Max;

if( var_R == var_Max ) dValH = del_B - del_G;
else if ( var_G == var_Max ) dValH = ( 1 / 3 ) + del_R - del_B;
else if ( var_B == var_Max ) dValH = ( 2 / 3 ) + del_G - del_R;

if ( dValH < 0 ) ; dValH += 1;
if ( dValH > 1 ) ; dValH -= 1;
}
}

void __stdcall XYZ2LUV(float x, float y, float z, float &L, float &u, float &v)
{
//定义X0,Y0,X0为D65 CIE 标准光源的色度坐标
float X0=95.05f,Y0=100.00f,Z0=108.90f;
float fx=x/X0,fy=y/Y0,fz=z/Z0,frx,fry,frz;
float k =0.333;

if(fx>0.008856) frx=float(pow(fx,k));
else frx=7.787f*fx+16.0f/116.0f;

if(fy>0.008856) fry=float(pow(fy,k));
else fry=7.787f*fy+16.0f/116.0f;

if(fz>0.008856) frz=float(pow(fz,k));
else frz=7.787f*fz+16.0f/116.0f;

if(fx<=0.008856 && fy<=0.008856 && fz<=0.008856)
{
L=903.3f*fy;
u=3893.5f*(fx-fy);
v=1557.4f*(fy-fz);
}
else
{
L=116*fry-16;
u=500*(frx-fry);
v=200*(fry-frz);
}
}
senr0816 2009-09-27
  • 打赏
  • 举报
回复
帮顶~等人解答
lambochan 2009-09-27
  • 打赏
  • 举报
回复
空间换时间,Map住整个RGB来查表...
h = map_HSL[r][g][b].h;// O(1)

其实很多此类的变换/逆变换都可以map住来查表,如alpha合成等,书本不会提及的.
LPR_Pro 2009-09-27
  • 打赏
  • 举报
回复
这个只是它的转换公式.
laviewpbt 2009-09-27
  • 打赏
  • 举报
回复
http://www.xbeat.net/vbspeed/c_RGBToHSL.htm

http://www.xbeat.net/vbspeed/c_RGBToHSL2.htm
LPR_Pro 2009-09-27
  • 打赏
  • 举报
回复
楼上的,这个是HSLtoRGB的,有没有反向的.
laviewpbt 2009-09-27
  • 打赏
  • 举报
回复
给你一个VB网站上对这个优化。

http://www.xbeat.net/vbspeed/c_HSLToRGB.htm
LPR_Pro 2009-09-27
  • 打赏
  • 举报
回复
要是网上能查到我就不需要来开贴了,
希望做过的能提供一些思路.谢谢
dirdirdir3 2009-09-27
  • 打赏
  • 举报
回复
这种经典问题网上查一下就知道了,有的话就有,没有的话问其他人也不会知道.........................

19,468

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 图形处理/算法
社区管理员
  • 图形处理/算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧