前言

RGB色彩空间是一种被广泛接受的色彩空间,但是该色彩空间过于抽象,我们不能够直接通过其值感知具体的色彩。我们更习惯使用直观的方式来感知颜色,HSV色彩空间提供了这样的方式。通过HSV色彩空间,我们能够更加方便地通过色调、饱和度和亮度来感知颜色。

其实,除了HSV色彩空间,我们讨论的其他大多数色彩空间都不方便人们对颜色进行理解和解释。

基础知识

HSV色彩空间从心理学和视觉的角度出发,提出人眼的色彩知觉主要包含三要素:

  • H:色调(Hue)
  • S:饱和度(Saturation)
  • V:亮度(Value)

1. 色调H

在HSV色彩空间中,色调H的取值范围是[0,360]。8位图像内每个像素点所能表示的灰度级有256个,所以在8位图像内表示HSV图像时,要把色调的角度映射到[0,255]范围内。在OpenCV中,可以直接把色调的角度值除以2,得到[0,180]之间的值,以适应8位二进制的存储和表示范围。

色调值 颜色
0 红色
30 黄色
60 绿色
90 青色
120 蓝色
150 品红色

确定值范围后,就可以直接在图像的H通道内找对应的值,从而找到特定的颜色。

2. 饱和度S

饱和度值的范围是[0,1],所以针对饱和度,需要说明以下问题:

  • 灰度颜色所包含R、G、B的成分是相当的,相当于一种极不饱和的颜色。所以,灰度颜色的饱和度是0。
  • 作为灰度图像显示时,较亮区域对应的颜色具有较高的饱和度。
  • 如果颜色的饱和度很低,那么它计算所得色调就不可靠。

同样要将饱和度S的值从[0,1]范围映射到[0,255]内。

3. 亮度

亮度范围与饱和度范围一致,都是[0,1]。同样,亮度值在OpenCV内也将值映射到[0,255]范围内。

亮度值越大,图像越亮;亮度值越低,图像越暗。当亮度值为0时,图像为纯黑色。

举例

大家看一段代码:

import cv2
import numpy as np
#=========测试下OpenCV中蓝色的HSV模式值=============
imgBlue=np.zeros([1,1,3],dtype=np.uint8)
imgBlue[0,0,0]=255
Blue=imgBlue
BlueHSV=cv2.cvtColor(Blue,cv2.COLOR_BGR2HSV)
print("Blue=\n",Blue)
print("BlueHSV=\n",BlueHSV)
#=========测试下OpenCV中绿色的HSV模式值=============
imgGreen=np.zeros([1,1,3],dtype=np.uint8)
imgGreen[0,0,1]=255
Green=imgGreen
GreenHSV=cv2.cvtColor(Green,cv2.COLOR_BGR2HSV)
print("Green=\n",Green)
print("GreenHSV=\n",GreenHSV)
#=========测试下OpenCV中红色的HSV模式值=============
imgRed=np.zeros([1,1,3],dtype=np.uint8)
imgRed[0,0,2]=255
Red=imgRed
RedHSV=cv2.cvtColor(Red,cv2.COLOR_BGR2HSV)
print("Red=\n",Red)
print("RedHSV=\n",RedHSV)

在本例中,对蓝色、绿色、红色三种不同颜色分别进行转换,将他们从RGB色彩空间转到HSV色彩空间,观察转换后得到HSV色彩空间的值,如图所示:

从结果可以看到,各种颜色的值与表中所列出的情况一致。

结尾

通过有效利用HSV色彩空间,我们可以很方便地实现如显示特定颜色值、艺术效果等多种目的。HSV色彩空间使色彩的显示更加直观,具有很高的实用价值。