HSV色彩模型

487 阅读5分钟

最近做图像处理时学到,可以把RGB转成HSV。一直非常不理解HSV,于是学习了一番。

简介

HSV是Hue色相,Saturation饱和度,Value亮度。色相是那种color wheel,所以范围是[0,360],其中0,120,240度分别是纯R/G/B。S和V都是[0,100]。

问题

我不太理解的是,HSV与RGB,HSV的S和V看起来很像,一个饱和度一个亮度,区别在哪?而RGB需要三个值来调节颜色,HSV只需要一个H就能调节颜色,这又是怎么做到的?H只能由RGB中的1-2个颜色组合,而RGB大部分时候都是三个颜色一起作用的,这是怎么映射的呢?

HSV和RGB在相同的色彩空间

首先HSV和RGB的色彩空间是相同的。上面提到H的色轮上也是RGB,所以HSV和RGB其实都是在一个色彩空间里的。实际上它们的覆盖范围也是一样的,例如HSV的0,0,0就是RGB的0,0,0黑色,HSV的0,0,100就是RGB的256,256,256白色,他们描绘了相同的两个box,并且每个HSV都可以映射到RGB(虽然在映射过程中可能有四舍五入)。

HSV是调配过的RGB

下面称H选择的两个颜色为主次颜色(更偏向的为主颜色),未选择的是空颜色。H同时调控了主次颜色,用来决定色相,S则同时调控了次空颜色,用来抵消,产生灰度。所以HSV类似一种调配过了的RGB,更符合人类体质的采样方案、色彩模型。比如色相、饱和度、亮度,这些名字都是我们更好理解(intuitive)和选择的,而如果要用RGB编一个颜色,则似乎有些困难,因为颜色之间有调和抵消作用,这个是我们直观上不好把握的,所以HSV适合人眼来进行的工作,例如PS。HSV有360*100*100,约3.6million种组合;而RGB是256*256*256,约16.7m,组合数量不一样,但这只是采样数量的区别。HSV少很多,平均4~5个RGB值只能映射到1个HSV,所以HSV采样更稀疏,颜色之间的差异相对更明显。实际上人眼只能分辨1-2million种颜色,也不到HSV的水平。由于一个HSV能覆盖更多的RGB,因此在一些图像选区分割任务时,HSV也有更好的"泛化"能力,降低难度。

HSV => RGB

  1. H用来调节主/次颜色,主颜色总是1。次颜色介于01之间,在轮盘上,次颜色是线性变化的,比如H在30度时,主颜色R=1,次颜色G=0.5。
  2. S则通过调节次/空颜色来抵消H。例如,如果饱和度为100,则不需要抵消;如果饱和度低于100,肯定要增加空颜色,适度调节次颜色。
  3. 最后V算是相对独立的,它均等的控制三种颜色,即*V*255。

以H在[0,60](R为主颜色,G为次颜色)为例:

  • R=1*V*255
  • G=(1-S*(1-H))*V*255
  • B=(1-S)*V*255

其实这三个式子都可以写成:(只是主颜色和空颜色的H固定为0和1)

  • (1-S*(1-H))*V*255

这个式子(1-S*(1-H))的实际含义我想了好久。首先,S是反向的,75饱和度表示用25的空颜色来抵消,所以1-S肯定没跑。关键是H怎么和S关联起来。空颜色的H为0,此时S满负荷生效;主颜色的H为1,此时S不生效,所以显然应该给S*(1-H)。这个是从设定来推公式,但如果要从公式来说明实际含义的话……上面说的S调节次/空颜色来抵消主颜色,是针对RGB整体的。对于单个颜色,S应该是通过削弱这个颜色的“抵消颜色”来增加这个颜色,也就是S*(1-H),只能说这样的计算公式是由于饱和度这个概念/设定所导致的。

HSV采样的分布不均匀

从这个式子可以看出来,这是一个三次函数,HSV都介于[0,1]之间,虽然H/S/V的取值是均匀分布的,但HSV对应的RGB值是不均匀分布的(只有主颜色是均匀的)。而对于普通RGB来说,RGB在三个坐标轴上都是均匀分布的。因此,HSV和RGB的另一个区别是采样分布不同。次/空颜色数值更集中在高饱和度低亮度,因此这边的HSV颜色相对会更准确的描述我们理想的颜色(甚至会超过RGB精度)(编辑,不会超过,所有HSV颜色都可以用RGB表示,也就是HSV转到RGB是经过四舍五入甚至扩张的,挤不下也得挤),而在较为稀疏的区域,则相对会不准确(甚至远低于RGB,也是我猜的)。此外,HSV不同数值是可以得出相同颜色的,例如V=0时始终为黑;S=0,V=100时,始终为白。

最后,尽管通常HSV表示为360*100*100,但实际采样率如何全由自己定义。比如我用的opencv.js中,H范围是180,S和V范围是255。而我使用的一个colorpicker,它的S和V范围是0和1,这是由于它们自己实现决定的,HSV仅仅是色彩模型,可以通过HSV计算到对应的RGB,不管怎么定义,它们都逃不出RGB的box。