您的位置:首页 > 编程语言 > C语言/C++

C++ RGB转HSV

2014-05-29 00:39 2863 查看
因为需要一个RGB转到HSV颜色空间,在网上查询了一些资料,但感觉都凌乱,并且大部分都是HSL的,索性就写一个吧,由于读取的图像格式为BGR的,所以输入的为一个BRG格式的结构体,应该不影响大家使用。直接上干货。

#include <iostream>
#include <cmath>

using namespace std;

#define UCHAR unsigned char

struct BGR//定义结构体
{
	UCHAR blue;
	UCHAR green;
	UCHAR red;
};

inline int bgr_feature(BGR *pixel)
	{
		UCHAR b=pixel->blue,g=pixel->green,r=pixel->red;
		UCHAR max,min,tmp;
		float h=0,s=0,v=0,f_tmp=0;
		tmp=b>g?b:g;
		max=tmp>r?tmp:r;//取得最大值
		             if(max==0) return 0;   //当全是0时,直接返回0;*****
		tmp=b>g?g:b;
		min=tmp>r?r:tmp;//取得最小值
		if(max==min)
			goto here;
		h=r-g;
		s=r-b;
		v=g-b;
		f_tmp=acos((h+s)/2/sqrt(h*h+s*v))*180/3.1415926;
		if(b<=g) 
			h=f_tmp;
         	else h=360-f_tmp;
here
		s=(max-min)/static_cast<float>(max);//s
		v=max/255.0;//v

		cout<<"h="<<h<<endl;
		cout<<"s="<<s<<endl;
		cout<<"v="<<v<<endl;
		return 1;
	}

void main( )   
{   
    unsigned char a=10,b=15;     
	char c=a-b;
	BGR my;
	my.red=5;   //可以在这里设定初始的GRB值
	my.green=5;
	my.blue=0;
    bgr_feature(&my);
}




在这里需要注意的是, 我为了自己方便 ,在输入的RGB全为零时,直接返回0了,所以会没有输出,这里明白就好了。

另外,附上转换公式,在这时上截图一张



这个公式里没有体现出来,当全为0及最大值与最小相等的情况。

在最大值全为0即GRB均为0时,HSV就全为0

当最大值不为0且最大值与最小值相等(即RGB颜色值相等且不为0)时,h=0.s=0,v不为0

这样,最后得出的结果H在[0 , 360),s和v都在[0 , 1]
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: