opencv hsv cvtColor颜色空间转换
RGB
加法原色模型, 以原色组合的方式定义颜色,面向硬件.
三通道图:
每个像素点都有3个值表示,所以就是3通道
通过对红(R)、绿(G)、蓝(B)三个颜色通道的变化以及它们相互之间的叠加来得到各式各样的颜色的,RGB即是代表红、绿、蓝三个通道的颜色
单通道图,
俗称灰度图,每个像素点只能有有一个值表示颜色,它的像素值在0到255之间,0是黑色,255是白色,中间值是一些不同等级的灰色
CMYK
减法原色模型,以原色组合的方式定义颜色,面向硬件
HSV颜色空间(HSV六棱锥模型,实际图像中表示):
色调(Hue):0~360度(所处光谱颜色的位置,用角度量)
饱和度(Saturation): 0~1(所选颜色的纯度和该颜色最大的纯度之间的比率)
亮度(Value): 0~1(0~1.0 => 黑色~白色)
OpenCV中HSV颜色空间:
H:0-180(或0~255)
S:0-255
V:0-255
HSV颜色模型是面向用户,是一种比较直观的颜色模型.
RGB转化到HSV的算法:
max=max(R,G,B)
min=min(R,G,B)
V=max(R,G,B)
S=(max-min)/max
ifR = max,H =(G-B)/(max-min)* 60
ifG = max,H = 120+(B-R)/(max-min)* 60
ifB = max,H = 240 +(R-G)/(max-min)* 60
ifH < 0,H = H+ 360
HSV转化到RGB的算法:
if s = 0
R=G=B=V
else
H /= 60;
i = INTEGER(H)
f = H - i
a = V * ( 1 - s )
b = V * ( 1 - s * f )
c = V * ( 1 - s * (1 - f ) )
switch(i)
case 0: R = V; G = c; B = a;
case 1: R = b; G = v; B = a;
case 2: R = a; G = v; B = c;
case 3: R = a; G = b; B = v;
case 4: R = c; G = a; B = v;
case 5: R = v; G = a; B = b;
颜色空间转换:
void cvtColor(InputArray src, OutputArray dst, int code, int dstCn=0)
src: 输入图像(要转化的原图像)
dst: 输出图像(转化后存放的图像空间)
code: 颜色空间转换标识符
OpenCV2中以CV_前缀宏命名规范
OpenCV3中以COLOR_式的宏命名前缀
(RGB色彩空间默认通道顺序为BGR)
dstCn: 目标图像的通道数,该参数为0时,目标图像根据源图像的通道数和具体操作自动决定
cvtColor和cvCvtColor区别:
1、C++接口:
void cvtColor(InputArray src, OutputArray dst, int code, int dstCn=0 )
//InputArray:接口类可以是Mat、Mat_<T>、Mat_<T, m, n>、vector<T>、vector<vector<T>>、vector<Mat>
2、C接口:
void cvCvtColor(const CvArr* src, CvArr* dst, int code); //CvArr* src 可以是iplimage类型
Mat是C++中的一个类,用Mat定义变量,要用cvtColor()函数来调用。
CvMat是C中的一个结构体,用CvMat定义的变量,要用cvCvtColor()函数来调用。
转为灰度图:
cvCvtColor(srcImg, grayImg, CV_BGR2GRAY);
cvtColor(srcImg, grayImg, CV_BGR2GRAY );
参数code(颜色空间转换类型,具体见/sdk/native/jni/include/opencv2/imgproc/Types_c.h):
color conversion, such as:
CV_BGR2GRAY =6,
CV_RGB2GRAY =7,
CV_GRAY2BGR =8,
CV_GRAY2RGB =CV_GRAY2BGR,
CV_GRAY2BGRA =9,
CV_GRAY2RGBA =CV_GRAY2BGRA,
CV_BGRA2GRAY =10,
CV_RGBA2GRAY =11,