颜色空间及其之间的转换
2013-06-20 11:17
211 查看
对植物进行识别时,选用绿色做为特征,进行颜色过滤。
载入图像的颜色空间采用RGB模式,为了便于利用逻辑表达式进行过滤,将其转换为HSV模式后,再利用色相值。
对一种颜色进行编码的方法统称为“颜色空间”或“色域”。用最简单的话说,世界上任何一种颜色的“颜色空间”都可定义成一个固定的数字或变量。
RGB格式
RGB(红、绿、蓝)只是众多颜色空间的一种。采用这种编码方法,每种颜色都可用三个变量来表示红色、绿色以及蓝色的强度。记录及显示彩色图像时,RGB是最常见的一种方案。但是,它缺乏与早期黑白显示系统的良好兼容性。因此,许多电子电器厂商普遍采用的做法是,将RGB转换成YUV颜色空间,以维持兼容,再根据需要换回RGB格式,以便在电脑显示器上显示彩色图形。
RGB色彩模式使用RGB模型为图像中每一个像素的RGB分量分配一个0~255范围内的强度值。RGB图像只使用三种颜色,就可以使它们按照不同的比例混合,在屏幕上重现16777216(256 * 256 * 256)种颜色。
RGB颜色模型映射到一个立方体上。水平的x轴代表红色,向左增加。y轴代表绿色,向右下方向增加。竖直的z轴代表蓝色,向上增加。原点代表黑色,遮挡在立方体背面。缺掉的最突出端点,也就是黑色的对角点为白色。
下图展示了24 bpp的RGB 立方体的三个“完全饱和”面,它们被展开到了平面上:
HSV 颜色模型
这个模型中颜色的参数分别是:色调(H)、饱和度(S)、亮度(V)。
色调——H:用角度度量,取值范围为0°~360°,从红色开始按逆时针方向计算,红色为0°,绿色为120°,蓝色为240°。它们的补色是:黄色为60°,青色为180°,品红为300°;
饱和度——S:取值范围为0.0~1.0;
亮度——V:取值范围为0.0(黑色)~1.0(白色)。
HSV 对用户来说是一种直观的颜色模型。我们可以从一种纯色彩开始,即指定色彩角——H,并让 V=S=1,然后我们可以通过向其中加入黑色和白色来得到我们需要的颜色。增加黑色可以减小 V 而 S 不变,同样增加白色可以减小 S 而 V 不变。例如,要得到深蓝色,V=0.4、S=1、H=240度;要得到淡蓝色,V=1、S=0.4、H=240度。
HSV 是对 RGB 色彩空间中点的两种有关系的表示,它们尝试描述比 RGB 更准确的感知颜色联系,并仍保持在计算上简单。其实,RGB 和 CMYK 颜色模型都是面向硬件的,而 HSV 颜色模型是面向用户的。
艺术家有时偏好使用 HSV 而不选择 三原色光模式(即 RGB 模型——加法原色模型)或 印刷四分色模式(即 CMYK 模型——减法原色模型),因为它类似于人类感觉颜色的方式,具有较强的感知度,以人类更熟悉的方式封装了关于颜色的信息:“这是什么颜色?深浅如何?明暗如何?”。
HSV 模型通常用于计算机图形应用中。在用户必须选择一个颜色应用于特定图形元素时,各种应用环境中经常使用 HSV 色轮。在其中,色相表示为圆环,可以使用一个独立的三角形来表示饱和度和明度。典型的,这个三角形的垂直轴指示饱和度,而水平轴表示明度。在这种方式下,选择颜色可以首先在圆环中选择色相,在从三角形中选择想要的饱和度和明度。
HSV 模型的另一种可视方法是圆锥体。在这种表示中,色相被表示为绕圆锥中心轴的角度,饱和度被表示为从圆锥的横截面的圆心到这个点的距离,明度被表示为从圆锥的横截面的圆心到顶点的距离。某些表示使用了六棱锥体。这种方法更适合在一个单一物体中展示这个 HSV 色彩空间,但是由于它的三维本质,它不适合在二维计算机界面中选择颜色。
HSV模型的三维表示从RGB立方体演化而来。设想从RGB沿立方体对角线的白色顶点向黑色顶点观察,就可以看到立方体的六边形外形。六边形边界表示色彩,水平轴表示纯度,明度沿垂直轴测量。
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;
YUV颜色空间
YUV 是被欧洲电视系统所采用的一种颜色编码方法(属于PAL),是 PAL 和 SECAM 模拟彩色电视制式采用的颜色空间。YUV 主要用于优化彩色视频信号的传输,使其向后兼容老式黑白电视。与 RGB 视频信号传输相比,它最大的优点在于只需占用极少的频宽(RGB 要求三个独立的视频信号同时传输)。其中“Y”表示明亮度,也就是灰阶值,而“U”和“V” 表示的则是色度,作用是描述影像色彩及饱和度,用于指定像素的颜色。采用 YUV 色彩空间的重要性是它的亮度信号Y和色度信号U、V是分离的。如果只有Y信号分量而没有U、V分量,那么这样表示的图像就是黑白灰度图像。彩色电视采用
YUV 空间正是为了用亮度信号Y解决彩色电视机与黑白电视机的兼容问题,使黑白电视机也能接收彩色电视信号。但在现今,YUV 通常已经在电脑系统上广泛使用。
图像中的Y、U和V的组成
OpenCV中与颜色模型相关的方法
函数 cvCvtColor 将输入图像从一个色彩空间转换为另外一个色彩空间。函数忽略 IplImage 头中定义的 colorModel 和 channelSeq 域,所以输入图像的色彩空间应该正确指定 (包括通道的顺序)。
void cvCvtColor(//色彩空间转换
const CvArr* src,//输入的8-bit、16-bit或32-bit单倍精度浮点数影像
CvArr* dst,//输出的8-bit、16-bit或32-bit单倍精度浮点数影像
int code);//定义色彩空间转换模式
注意:
OpenCV 中的 HSV 模型各分量的范围
H : 0—180
S : 0—255
V : 0—255
向标准形式的转换:H*2、V/255、S/255
载入图像的颜色空间采用RGB模式,为了便于利用逻辑表达式进行过滤,将其转换为HSV模式后,再利用色相值。
对一种颜色进行编码的方法统称为“颜色空间”或“色域”。用最简单的话说,世界上任何一种颜色的“颜色空间”都可定义成一个固定的数字或变量。
RGB格式
RGB(红、绿、蓝)只是众多颜色空间的一种。采用这种编码方法,每种颜色都可用三个变量来表示红色、绿色以及蓝色的强度。记录及显示彩色图像时,RGB是最常见的一种方案。但是,它缺乏与早期黑白显示系统的良好兼容性。因此,许多电子电器厂商普遍采用的做法是,将RGB转换成YUV颜色空间,以维持兼容,再根据需要换回RGB格式,以便在电脑显示器上显示彩色图形。
RGB色彩模式使用RGB模型为图像中每一个像素的RGB分量分配一个0~255范围内的强度值。RGB图像只使用三种颜色,就可以使它们按照不同的比例混合,在屏幕上重现16777216(256 * 256 * 256)种颜色。
RGB颜色模型映射到一个立方体上。水平的x轴代表红色,向左增加。y轴代表绿色,向右下方向增加。竖直的z轴代表蓝色,向上增加。原点代表黑色,遮挡在立方体背面。缺掉的最突出端点,也就是黑色的对角点为白色。
下图展示了24 bpp的RGB 立方体的三个“完全饱和”面,它们被展开到了平面上:
HSV 颜色模型
这个模型中颜色的参数分别是:色调(H)、饱和度(S)、亮度(V)。
色调——H:用角度度量,取值范围为0°~360°,从红色开始按逆时针方向计算,红色为0°,绿色为120°,蓝色为240°。它们的补色是:黄色为60°,青色为180°,品红为300°;
饱和度——S:取值范围为0.0~1.0;
亮度——V:取值范围为0.0(黑色)~1.0(白色)。
HSV 对用户来说是一种直观的颜色模型。我们可以从一种纯色彩开始,即指定色彩角——H,并让 V=S=1,然后我们可以通过向其中加入黑色和白色来得到我们需要的颜色。增加黑色可以减小 V 而 S 不变,同样增加白色可以减小 S 而 V 不变。例如,要得到深蓝色,V=0.4、S=1、H=240度;要得到淡蓝色,V=1、S=0.4、H=240度。
HSV 是对 RGB 色彩空间中点的两种有关系的表示,它们尝试描述比 RGB 更准确的感知颜色联系,并仍保持在计算上简单。其实,RGB 和 CMYK 颜色模型都是面向硬件的,而 HSV 颜色模型是面向用户的。
艺术家有时偏好使用 HSV 而不选择 三原色光模式(即 RGB 模型——加法原色模型)或 印刷四分色模式(即 CMYK 模型——减法原色模型),因为它类似于人类感觉颜色的方式,具有较强的感知度,以人类更熟悉的方式封装了关于颜色的信息:“这是什么颜色?深浅如何?明暗如何?”。
HSV 模型通常用于计算机图形应用中。在用户必须选择一个颜色应用于特定图形元素时,各种应用环境中经常使用 HSV 色轮。在其中,色相表示为圆环,可以使用一个独立的三角形来表示饱和度和明度。典型的,这个三角形的垂直轴指示饱和度,而水平轴表示明度。在这种方式下,选择颜色可以首先在圆环中选择色相,在从三角形中选择想要的饱和度和明度。
HSV 模型的另一种可视方法是圆锥体。在这种表示中,色相被表示为绕圆锥中心轴的角度,饱和度被表示为从圆锥的横截面的圆心到这个点的距离,明度被表示为从圆锥的横截面的圆心到顶点的距离。某些表示使用了六棱锥体。这种方法更适合在一个单一物体中展示这个 HSV 色彩空间,但是由于它的三维本质,它不适合在二维计算机界面中选择颜色。
HSV模型的三维表示从RGB立方体演化而来。设想从RGB沿立方体对角线的白色顶点向黑色顶点观察,就可以看到立方体的六边形外形。六边形边界表示色彩,水平轴表示纯度,明度沿垂直轴测量。
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;
YUV颜色空间
YUV 是被欧洲电视系统所采用的一种颜色编码方法(属于PAL),是 PAL 和 SECAM 模拟彩色电视制式采用的颜色空间。YUV 主要用于优化彩色视频信号的传输,使其向后兼容老式黑白电视。与 RGB 视频信号传输相比,它最大的优点在于只需占用极少的频宽(RGB 要求三个独立的视频信号同时传输)。其中“Y”表示明亮度,也就是灰阶值,而“U”和“V” 表示的则是色度,作用是描述影像色彩及饱和度,用于指定像素的颜色。采用 YUV 色彩空间的重要性是它的亮度信号Y和色度信号U、V是分离的。如果只有Y信号分量而没有U、V分量,那么这样表示的图像就是黑白灰度图像。彩色电视采用
YUV 空间正是为了用亮度信号Y解决彩色电视机与黑白电视机的兼容问题,使黑白电视机也能接收彩色电视信号。但在现今,YUV 通常已经在电脑系统上广泛使用。
图像中的Y、U和V的组成
OpenCV中与颜色模型相关的方法
函数 cvCvtColor 将输入图像从一个色彩空间转换为另外一个色彩空间。函数忽略 IplImage 头中定义的 colorModel 和 channelSeq 域,所以输入图像的色彩空间应该正确指定 (包括通道的顺序)。
void cvCvtColor(//色彩空间转换
const CvArr* src,//输入的8-bit、16-bit或32-bit单倍精度浮点数影像
CvArr* dst,//输出的8-bit、16-bit或32-bit单倍精度浮点数影像
int code);//定义色彩空间转换模式
注意:
OpenCV 中的 HSV 模型各分量的范围
H : 0—180
S : 0—255
V : 0—255
向标准形式的转换:H*2、V/255、S/255
相关文章推荐
- YUV颜色空间及其与RGB的转换
- RGB和YCbCr颜色空间之间的转换及优化算法
- 颜色迁移之一——基础知识(色彩空间及其转换)
- 【OpenCV】CvCreateImage函数说明以及颜色空间量化之间转换
- 颜色迁移之一——基础知识(色彩空间及其转换)
- HSI颜色空间和RGB颜色空间之间的相互转换
- RGB颜色空间与YUV等颜色空间之间的转换单元
- OpenCV 颜色空间转换参数CV_BGR2GRAY改变
- RGB和HLS颜色空间互相转换的类
- 图像处理基础-颜色空间转换(3)
- 【Python基础】1.4.2 温度转换程序及其关联颜色升级版
- 【OpenCV】 RGB和CIEXYZ颜色空间的转换及相关优化。
- BCD码简介及其与十进制数字字符串之间的转换
- 十六进制颜色值域RGB格式颜色值之间的相互转换
- Java中数据类型及其之间的转换
- 颜色空间RGB与HSV(HSL)的转换
- OpenCV学习笔记(八)--颜色空间及转换
- 颜色空间RGB与HSV(HSL)的转换
- opencv学习笔记之六 颜色空间的转换
- RGB、HSB\HSV、HSL三种颜色空间的原理理解与转换