颜色空间是指针对一个给定的颜色,如何组合颜色元素以及对其编码。常用的颜色空间有以下几种:
1、RGB
2、GRAY
3、HSV
RGB色彩模式是工业界的一种颜色标准,是通过对红(R)、绿(G)、蓝(B)三个颜色通道的变化以及它们相互之间的叠加来得到各式各样的颜色的,RGB即是代表红、绿、蓝三个通道的颜色,这个标准几乎包括了人类视力所能感知的所有颜色,是目前运用最广的颜色系统之一。
任何颜色都有红、绿、蓝三原色组成,假如原来某点的颜色为RGB(R,G,B),那么,我们可以通过下面几种方法,将其转换为灰度:
1)浮点算法:Gray=R*0.3+G*0.59+B*0.11
2)整数方法:Gray=(R*30+G*59+B*11)/100
3)移位方法:Gray =(R*76+G*151+B*28)>>8;
4)平均值法:Gray=(R+G+B)/3;
5)仅取绿色:Gray=G;
通过上述任一种方法求得Gray后,将原来的RGB(R,G,B)中的R,G,B统一用Gray替换,形成新的颜色RGB(Gray,Gray,Gray),用它替换原来的RGB(R,G,B)就是灰度图了。
HSV(Hue, Saturation, Value)是根据颜色的直观特性由A. R. Smith在1978年创建的一种颜色空间, 也称六角锥体模型(Hexcone Model)。这个模型中颜色的参数分别是:色调(H),饱和度(S),明度(V)。
色调(H):用角度度量,取值范围为0°~360°,从红色开始按逆时针方向计算,红色为0°,绿色为120°,蓝色为240°。它们的补色是:黄色为60°,青色为180°,品红为300°;
饱和度(S):饱和度S表示颜色接近光谱色的程度。一种颜色,可以看成是某种光谱色与白色混合的结果。其中光谱色所占的比例愈大,颜色接近光谱色的程度就愈高,颜色的饱和度也就愈高。饱和度高,颜色则深而艳。光谱色的白光成分为0,饱和度达到最高。通常取值范围为0%~100%,值越大,颜色越饱和。
明度(V):明度表示颜色明亮的程度,对于光源色,明度值与发光体的光亮度有关;对于物体色,此值和物体的透射比或反射比有关。通常取值范围为0%(黑)到100%(白)。
RGB->GRAY算法:
1)浮点算法:Gray=R*0.3+G*0.59+B*0.11
2)整数方法:Gray=(R*30+G*59+B*11)/100
3)移位方法:Gray =(R*76+G*151+B*28)>>8;
4)平均值法:Gray=(R+G+B)/3;
5)仅取绿色:Gray=G;
RGB->HSV算法:
max=max(R,G,B);
min=min(R,G,B);
V=max(R,G,B);
S=(max-min)/max;
if (R = max) H =(G-B)/(max-min)* 60;
if (G = max) H = 120+(B-R)/(max-min)* 60;
if (B = max) H = 240 +(R-G)/(max-min)* 60;
if (H < 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;
下面给出opencv2.4.13中将RGB转化为GRAY和HSV的API:
C++: void cvtColor(InputArray src, OutputArray dst, int code, int dstCn=0 )
Parameters:
src – input image: 8-bit unsigned, 16-bit unsigned ( CV_16UC... ), or single-precision floating-point.
dst – output image of the same size and depth as src.
code – color space conversion code .
dstCn – number of channels in the destination image; if the parameter is 0, the number of the channels is derived automatically from src and code .
代码:
#include
using namespace cv;
int main()
{
Mat src, gray_dst,hsv_dst;
src = imread("E:/opencv/1.jpg");
namedWindow("【原图像】", CV_WINDOW_AUTOSIZE);
imshow("【原图像】", src);
//RGB颜色空间转化为灰度图像
cvtColor(src, gray_dst, COLOR_BGR2GRAY);
imshow("【灰度图像】", gray_dst);
//RGB颜色空间转化为HSV颜色空间
cvtColor(src, hsv_dst, COLOR_BGR2HSV);
imshow("【HSV颜色空间】", hsv_dst);
waitKey(0);
return 0;
}
如图所示为运行结果: