标签归档:RGB

HSL和HSV色彩空间

基本概念

HSL和HSV都是一种将RGB色彩模型中的点在圆柱坐标系中的表示法。这两种表示法试图做到比RGB基于笛卡尔坐标系的几何结构更加直观。HSL即色相、饱和度、亮度(英语:Hue, Saturation, Lightness),又称HSL。HSV即色相、饱和度、明度(英语:Hue, Saturation, Value),又称HSB,其中B即英语:Brightness。

  • H:色相是色彩的基本属性,就是平常所说的颜色名称,如红色、黄色等。
  • S:饱和度(S)是指色彩的纯度,越高色彩越纯,低则逐渐变灰,取0-100%的数值。
  • V:明度(V),亮度(L),取0-100%。

HSL和HSV二者都把颜色描述在圆柱坐标系内的点,这个圆柱的中心轴取值为自底部的黑色到顶部的白色而在它们中间的是灰色,绕这个轴的角度对应于“色相”,到这个轴的距离对应于“饱和度”,而沿着这个轴的高度对应于“亮度”,“色调”或“明度”。

这两种表示在目的上类似,但在方法上有区别。二者在数学上都是圆柱,但HSV(色相,饱和度,明度)在概念上可以被认为是颜色的倒圆锥体(黑点在下顶点,白色在上底面圆心),HSL在概念上表示了一个双圆锥体和圆球体(白色在上顶点,黑色在下顶点,最大横切面的圆心是半程灰色)。注意:尽管在HSL和HSV中“色相”指称相同的性质,它们的“饱和度”的定义是明显不同的。

HSL和HSV的色彩空间

HSL和HSV的色彩空间

为什么考虑这种色彩空间

大多数电视机、显示器、投影仪通过将不同强度的红、绿、蓝色光混合来生成不同的颜色,这就是RGB三原色的加色法。通过这种方法可以在RGB色彩空间生成大量不同的颜色,然而,这三种颜色分量的取值与所生成的颜色之间的联系并不直观。

设计者们有时偏好使用HSL或HSV而不选择三原色光模式(即RGB模型)或 印刷四分色模式(即CMYK模型),因为它类似于人类感觉颜色的方式,具有较强的感知度。RGB和CMYK分别是加法原色和减法原色模型,以原色组合的方式定义颜色,而HSV以人类更熟悉的方式封装了关于颜色的信息:“这是什么颜色?深浅如何?明暗如何?”。

主要用途

HSV模型通常用于计算机图形应用中。在用户必须选择一个颜色应用于特定图形元素各种应用环境中,经常使用HSV 色轮。在其中,色相表示为圆环;可以使用一个独立的三角形来表示饱和度和明度。典型的,这个三角形的垂直轴指示饱和度,而水平轴表示明度。在这种方式下,选择颜色可以首先在圆环中选择色相,在从三角形中选择想要的饱和度和明度。

HSV的平面表示

HSV的平面表示

HSV模型的另一种可视方法是圆锥体。在这种表示中,色相被表示为绕圆锥中心轴的角度,饱和度被表示为从圆锥的横截面的圆心到这个点的距离,明度被表示为从圆锥的横截面的圆心到顶点的距离。某些表示使用了六棱锥体。这种方法更适合在一个单一物体中展示这个HSV色彩空间;但是由于它的三维本质,它不适合在二维计算机界面中选择颜色。

HSV的表示2

HSV的立体表示

由于HSL、HSV关于色相的划分与人眼识别是连续的,而RGB对人眼而言没那么只管,通常我们可以使用HSL、HSV进行计算机图像处理中的颜色分割,比如识别某个区域内“蓝色”系的物体等。

蓝色球体监测跟踪

蓝色球体监测跟踪

转换方式

RGB到HSL、HSV的转换

设 (r, g, b)分别是一个颜色的红、绿和蓝坐标,它们的值是在0到1之间的实数。设max等价于r, g和b中的最大者。设min等于这些值中的最小者。要找到在HSL空间中的 (h, s, l)值,这里的h ∈ [0, 360)度是角度的色相角,而s, l ∈ [0,1]是饱和度和亮度,计算为:

RGB转HSL

RGB转HSL

h的值通常规范化到位于0到360°之间。而h = 0用于max = min的(就是灰色)时候而不是留下h未定义。HSL和HSV有同样的色相定义,但是其他分量不同。HSV颜色的s和v的值定义如下:

RGB转HSV

RGB转HSV

同样,HSL、HSV也可以转换回RGB,在此不做介绍,可参考:维基百科:HSL和HSV色彩空间

程序实现

Python程序实现

程序的实现很简单,不考虑程序优化,根据公式直译即可:

# 函数名:rgb2hsv(rgb)
# 功能:RGB转换为HSV
# 输入:像素点的RGB值
# 输出:像素点的HSV值
def rgb2hsv(rgb): 
  rgbmax = max(rgb[:])
  rgbmin = min(rgb[:])
  r, g, b = rgb[:]
  h, s, v = 0

  if rgbmax == rgbmin:
    h = 0
  elif (rgbmax==r) and (g>=b):
    h = 60*(g-b)/(rgbmax-rgbmin)+0
  elif (rgbmax==r) and (g<b):
    h = 60*(g-b)/(rgbmax-rgbmin)+360
  elif rgbmax == g:
    h = 60*(b-r)/(rgbmax-rgbmin)+120
  elif rgbmax == b:
    h = 60*(r-g)/(rgbmax-rgbmin)+240

  v = rgbmax/255

  if rgbmax == 0:
    s = 0
  else:
    s = (rgbmax-rgbmin)/rgbmax
 
  hsv = [h, s, v]
  return hsv

OpenCV实现

OpenCV函数:cvtColor(src, flag)

输入:src为要进行转换的RGB图像;flag为转换参数,RGB转换HSV的参数是COLOR_RGB2HSV,也就是说通过不同的flag属性,这个函数还支持其他色彩格式的转换,详见OpenCV手册

输出:色彩格式转换后的图像。

程序示例:

# Filename: rgb2hsvbycv2.py
# 载入OpenCV模块
import cv2
# 读取一副图像
img = cv2.imread('motor.png')
# 将图像色彩格式转换为HSV
img_hsv = cv2.cvtColor(img, cv2.COLOR_RGB2HSV)

我们在进行程序设计的时候,通常尽量去使用已经创建好的函数库,而不是自己动手来写。原因很简单,通用的函数库已经充分做了程序优化,效率更高。