OPENCV学习笔记3-6_RGB->HSV
2018-01-21 19:44
549 查看
1.1 HSV
HSV(Hue, Saturation, Value)是根据颜色的直观特性由A. R. Smith在1978年创建的一种颜色空间, 也称六角锥体模型(Hexcone Model)。RGB颜色模型都是面向硬件的,而HSV颜色模型是面向用户的。色调H
色调表示主色,使用的颜色名称(例如绿色、黄色和红色)就对应了不同的色调值,取值范围为0°~360°,从红色开始按逆时针方向计算,红色为0°,绿色为120°,蓝色为240°。它们的补色是:黄色为60°,青色为180°,品红为300°。
饱和度S
饱和度表示颜色接近光谱色的程度(颜色的鲜艳程度)。一种颜色,可以看成是某种光谱色与白色混合的结果。其中光谱色所占的比例愈大,颜色接近光谱色的程度就愈高,颜色的饱和度也就愈高。饱和度高,颜色则深而艳。光谱色的白光成分为0,饱和度达到最高。通常取值范围为0%~100%,值越大,颜色越饱和。
明度V
明度表示颜色明亮的程度,对于光源色,明度值与发光体的光亮度有关;对于物体色,此值和物体的透射比或反射比有关。通常取值范围为0%(黑)到100%(白)。
HSV色彩空间通常用一个圆锥体来表示,圆锥体内部每个点代表一种特定的颜色。角度位置表示颜色的色调,到中轴
线的距离表示饱和度,高度表示亮度。圆锥体的顶点表示黑色,它的色调和饱和度是没有意义的。
通过把图像的通道分割到三个独立的图像中,可以直观地看到每一种HSV组件。因为处理的是8位图像,OpenCV会把通道值的范围重新调节为0~255(色调除外,色调的范围被调节为0~180)。
在对特定物体做初步检测时,颜色信息非常有用。例如在辅助驾驶程序中检测路标,就要凭借标准路标的颜色快速地提取出可能是路标的信息。另一个例子是检测皮肤的颜色,检测到的皮肤区域可作为图像中有人存在的标志。在手势识别中经常使用这个方法,用肤色检测来确定手的位置。
1.2 RGB to HSV conversion formula(转换公式)
The R,G,B values are divided by 255 to change the range from 0..255 to 0..1:1.3 Example Code
void Rgb2Hsv( float R, float G, float B, float & H, float & S, float &V ) { /* * r,g,b values are from 0 to 1 * h = [0,360], s = [0,1], v = [0,1] * if s == 0, then h = -1 (undefined) */ float min, max, delta, tmp; tmp = min( R, G ); min = min( tmp, B ); tmp = max( R, G ); max = max( tmp, 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 = UNDEFINEDCOLOR; 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; }
You can also try this code without floats (faster but less accurate):
typedef struct RgbColor { unsigned char r; unsigned char g; unsigned char b; } RgbColor; typedef struct HsvColor { unsigned char h; unsigned char s; unsigned char v; } HsvColor; HsvColor RgbToHsv(RgbColor rgb) { HsvColor hsv; unsigned char rgbMin, rgbMax; rgbMin = rgb.r < rgb.g ? (rgb.r < rgb.b ? rgb.r : rgb.b) : (rgb.g < rgb.b ? rgb.g : rgb.b); rgbMax = rgb.r > rgb.g ? (rgb.r > rgb.b ? rgb.r : rgb.b) : (rgb.g > rgb.b ? rgb.g : rgb.b); hsv.v = rgbMax; if (hsv.v == 0) { hsv.h = 0; hsv.s = 0; return hsv; } hsv.s = 255 * long(rgbMax - rgbMin) / hsv.v; if (hsv.s == 0) { hsv.h = 0; return hsv; } if (rgbMax == rgb.r) hsv.h = 0 + 43 * (rgb.g - rgb.b) / (rgbMax - rgbMin); //43 1;85 2; 6; 255 ; else if (rgbMax == rgb.g) hsv.h = 85 + 43 * (rgb.b - rgb.r) / (rgbMax - rgbMin); else hsv.h = 171 + 43 * (rgb.r - rgb.g) / (rgbMax - rgbMin); return hsv; }
or use opencv,
Mat img_hsv,img_rgb; img_rgb = imread("pic.png",1); cvtColor(img_rgb,img_hsv,CV_RGB2HSV); namedWindow("win1", CV_WINDOW_AUTOSIZE); imshow("win1", img_hsv); // split the 3 channels into 3 images //std::vector<cv::Mat> channels; //cv::split(hsv, channels); // channels[0] is the Hue // channels[1] is the Saturation // channels[2] is the Value
相关文章推荐
- OpenCV学习——物体跟踪的粒子滤波算法实现之RGB->HSV
- OPENCV学习笔记3-7_RGB->YCbCr
- Opencv2 学习笔记<一>:cv::Mat数据访问方式
- opencv3学习笔记(三)RGB HSV YUV相互转换
- <Test-Driven Development with Python>学习笔记 第一部分 测试驱动开发基础
- [原]java专业程序代写(qq:928900200),学习笔记之基础入门<JDBC>(二十四)
- windows学习笔记3——窗口和消息<一>
- C++学习的一些笔记-->2:防止头文件多次导入造成重复编译的方法
- <算法导论>学习笔记(3)--递归树求递归算法时间复杂度
- <了不起的NODEJS>学习笔记
- LDAP学习笔记<一>关于LDAP协议及其基本概念
- Cocos2d-x学习笔记(十二)-------->x引擎的数据保存
- <<Git Community Book中文版>>学习笔记
- <android 笔记>通知栏学习2
- OpenCV学习教程入门篇<一、介绍>
- <C++学习笔记一>——多继承
- cocos2dx lua学习笔记 <一> quick 3.5把自定义C++类绑定到lua
- 【js学习笔记-111】-----<canvas>图形属性
- 【js学习笔记-113】------<canvas>绘制和填充曲线
- R语言学习笔记之<字符串操作>