从 RGB 到 HSL 或 HSV 的转换
设 (r, g, b) 分别是一个颜色的红、绿和蓝坐标,它们的值是在 0 到 1 之间的实数。设 max 等价于 r, g 和 b 中的最大者。设 min 等于这些值中的最小者。要找到在 HSL 空间中的 (h, s, l) 值,这里的 h ∈ [0, 360)度是角度的色相角,而 s, l ∈ [0,1] 是饱和度和亮度,计算为:
上面的理论也是从别人那里直接拷贝过来的,基本的理论知识就在上面。
static int rgb2hsv_max(int a,int b,int c)
{
int max = a;
if(b > max) max = b;
if(c > max) max = c;
return max;
}
static int rgb2hsv_min(int a,int b,int c)
{
int min = a;
if(b < min) min = b;
if(c < min) min = c;
return min;
}
static int rgb2hsv(int r,int g,int b,int *h,int *s,int *v)
{
int imax,imin,diff;
imax = rgb2hsv_max(r,g,b);
imin = rgb2hsv_min(r,g,b);
diff = imax - imin;
*v = imax;
if(imax == 0)
*s = 0;
else
*s = diff;
if(diff != 0)
{
if(r == imax)
{
*h = 60 * (g - b) / diff;
}
else if(g == imax)
{
*h = 60 * (b - r) / diff + 120;
}
else
{
*h = 60 * (r - g) / diff + 240;
}
if(*h < 0)
*h = *h + 360;
}
else
*h = -1;
return 0;
}
这里采用hsv保留图像中的红色,滤除其他颜色:
static int RED_COLOR(int r,int g,int b)
{
int h,s,v;
rgb2hsv(r,g,b,&h,&s,&v);
if((h > 0 && h < 16) || (h > 240 && h < 360))
return 1;
return 0;
}
运行结果: