C++ RGB转HSV
2014-05-29 00:39
2863 查看
因为需要一个RGB转到HSV颜色空间,在网上查询了一些资料,但感觉都凌乱,并且大部分都是HSL的,索性就写一个吧,由于读取的图像格式为BGR的,所以输入的为一个BRG格式的结构体,应该不影响大家使用。直接上干货。
在这里需要注意的是, 我为了自己方便 ,在输入的RGB全为零时,直接返回0了,所以会没有输出,这里明白就好了。
另外,附上转换公式,在这时上截图一张
这个公式里没有体现出来,当全为0及最大值与最小相等的情况。
在最大值全为0即GRB均为0时,HSV就全为0
当最大值不为0且最大值与最小值相等(即RGB颜色值相等且不为0)时,h=0.s=0,v不为0
这样,最后得出的结果H在[0 , 360),s和v都在[0 , 1]
#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]
相关文章推荐
- 基于OpenCV的RGB和HSV色彩空间相互转换C++程序
- RGB空间与HSV空间的相互转换(C++实现,修正网上大多数的代码错误)
- HSV 和 RGB 互换 函数 c++
- HSV颜色到RGB的转换C++代码 直接可用
- RGB空间与HSV空间的相互转换(C++实现,修正网上大多数的代码错误)
- RGB空间与HSV空间的相互转换(C++实现,修正网上大多数的代码错误)
- 基于OpenCV的RGB和HSV色彩空间相互转换C++程序
- RGB转换为HSV的VC++代码
- 有关hsv与rgb的问题
- HSI、HSV、RGB、CMYK、HSL、HSB、Ycc、XYZ、Lab、YUV颜色模型的区别
- HSL和HSV色彩空间和rgb的互转
- RGB和HSL之间的转换 C++实现
- RGB、HSV色彩空间模式的互相转换
- HSI, HSV,RGB,HSL,HSB,CMYK ,Ycc,XYZ,Lab,YUV空间的区别
- hsv -> rgb
- HSI、HSV、RGB、CMYK、HSL、HSB、Ycc、XYZ、Lab、YUV颜色模型的区别
- HSI、HSV、RGB、CMYK、HSL、HSB、Ycc、XYZ、Lab、YUV颜色模型的区别
- [导入]RGB和HSV颜色转换
- How to make conversion between RGB and HSV? [Python sourcecode]
- RGB颜色空间转换为HSV空间颜色值