在RGB颜色值相同情况下,将RGB转化成HSV过程中出现的问题

weiyunchao 2010-09-11 11:03:48
以下是本人的转化算法,跟网上讲到的差不多,只是做了下归一化操作。转化过程中,若R==G==B 则会出现deltaRGB为0的结果,导致除0的运算错误,若三个值都为0时也会出现除maxRGB的运算错误,查阅一些公式似乎没有对这方面进行定义,希望高手指点一二!!
HSV RGBToHSV(int x,int y,int z)
{
double r,g,b,minRGB,maxRGB,deltaRGB;
HSV hsv;
r=(double)x/255.0;
g=(double)y/255.0;
b=(double)z/255.0;
minRGB=min(r,min(g,b));
maxRGB=max(r,max(g,b));//H:i*3+0,S:i*3+1,V:i*3+2
deltaRGB = maxRGB - minRGB;

hsv.V=maxRGB;
if (maxRGB != 0.0)
{
hsv.S=deltaRGB/maxRGB;
}
else
{
hsv.S=0.0;
hsv.H=(-1)/360.0;

}
if (r == maxRGB)
{
hsv.H = (g-b)/deltaRGB;
}
else if (g == maxRGB)
{
hsv.H = 2.0+ (b-r)/deltaRGB;
}
else
{
hsv.H=4.0+(r-g)/deltaRGB;
}
hsv.H=hsv.H*60.0;
if (hsv.H<0.0)
{
hsv.H+=360;
}
hsv.H/=360;
return hsv;
}
...全文
348 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
dirdirdir3 2010-09-14
  • 打赏
  • 举报
回复
三个都相同的时候就H无效(另外一句话就是什么值都是,直接用个0就行了),S为1.......
副组长 2010-09-11
  • 打赏
  • 举报
回复
老外的一段代码,上世纪70年代的。
IHS更流行一些,做什么?融合吗?

void CHSV_Fusion::RGBtoHSV( float r, float g, float b, float *h, float *s, float *v )
{
float min, max, delta;

min = min( r, g, b );
max = max( r, g, 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 = -1;
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;
}
laoma_hbu 2010-09-11
  • 打赏
  • 举报
回复
用HSI或HSV的时候,好像注意当饱和度为0或为1时,这时的H色调值是无效的。

19,469

社区成员

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

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