天天看点

图像处理之RGB转为HSV

从 RGB 到 HSL 或 HSV 的转换

设 (r, g, b) 分别是一个颜色的红、绿和蓝坐标,它们的值是在 0 到 1 之间的实数。设 max 等价于 r, g 和 b 中的最大者。设 min 等于这些值中的最小者。要找到在 HSL 空间中的 (h, s, l) 值,这里的 h ∈ [0, 360)度是角度的色相角,而 s, l ∈ [0,1] 是饱和度和亮度,计算为:

图像处理之RGB转为HSV

上面的理论也是从别人那里直接拷贝过来的,基本的理论知识就在上面。

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;
}
           

运行结果:

图像处理之RGB转为HSV