Maine

纵有疾风起,人生不言弃

hsv转rgb 以及 rgb转hsv 的 Python 实现

RGB 介绍

RGB是从颜色发光的原理来设计定的,通俗点说它的颜色混合方式就好像有红、绿、蓝三盏灯,当它们的光相互叠合的时候,色彩相混,而亮度却等于三者亮度之总和,越混合亮度越高,即加法混合。
红、绿、蓝三个颜色通道每种色各分为256阶亮度,在0时“灯”最弱——是关掉的,而在255时“灯”最亮。当三色灰度数值相同时,产生不同灰度值的灰色调,即三色灰度都为0时,是最暗的黑色调;三色灰度都为255时,是最亮的白色调。
在电脑中,RGB的所谓“多少”就是指亮度,并使用整数来表示。通常情况下,RGB各有256级亮度,用数字表示为从0、1、2…直到255。注意虽然数字最高是255,但0也是数值之一,因此共256级。

HSV 介绍

HSV是一种比较直观的颜色模型,所以在许多图像编辑工具中应用比较广泛,这个模型中颜色的参数分别是:色调(H, Hue),饱和度(S,Saturation),明度(V, Value)。

色调(Hue)

色调用角度度量,取值范围为0°~360°,从红色开始按逆时针方向计算,红色为0°,绿色为120°,蓝色为240°。它们的补色是:黄色为60°,青色为180°,品红为300°;

饱和度(Saturation)

饱和度S表示颜色接近光谱色的程度。一种颜色,可以看成是某种光谱色与白色混合的结果。其中光谱色所占的比例愈大,颜色接近光谱色的程度就愈高,颜色的饱和度也就愈高。饱和度高,颜色则深而艳。光谱色的白光成分为0,饱和度达到最高。通常取值范围为0%~100%,值越大,颜色越饱和。

明度(Value)

明度V表示颜色明亮的程度,有些软件也叫B,即(HSB)中的B,指的就是Brightness。对于光源色,明度值与发光体的光亮度有关;对于物体色,此值和物体的透射比或反射比有关。通常取值范围为0%(黑)到100%(白)。

转换算法

这方面网上一堆,公式略显复杂,直接 Pass,我们直接看代码实现

Python 实现

使用Python实现RGB和HSV的转换实在是太easy了,python自带了一个库,叫做colorsys,里面实现了 rgb_to_yiq yiq_to_rgb rgb_to_hls hls_to_rgb rgb_to_hsv hsv_to_rgb,是不是很赞,当然这里我们只关心 RGB和HSV的转换。

快速入门案例

import colorsys
hsv = colorsys.rgb_to_hsv(22/255.0, 88/255.0, 55/255.0)
print("H: %s" % (hsv[0]*360))
print("S: %s" % hsv[1])
print("V: %s" % hsv[2])
rgb = colorsys.hsv_to_rgb(hsv[0], hsv[1], hsv[2])
print(rgb)

需要注意的是,rgb_to_hsv() 函数接收 r,g,b 三个参数,但参数的取值范围是0-1,而我们输入的值往往都是0-255,所以需要除以255,这里除以浮点数(255.0)得到的也是浮点数。打印HSV的H的时候我们乘以360也是这个道理,默认结果0-1,我们需要0-360结果,做一下转换即可。不过并不是所有的软件都是这样设定的,有一些接收的就是0-1, o(╯□╰)o

最后,看一下算法的源码实现吧

其实源码就在Python安装目录下,名字叫做 colorsys.py,请自行查找,代码不长,自己看吧。

colorsys.py

# HSV: Hue, Saturation, Value
# H: position in the spectrum
# S: color saturation ("purity")
# V: color brightness

def rgb_to_hsv(r, g, b):
    maxc = max(r, g, b)
    minc = min(r, g, b)
    v = maxc
    if minc == maxc:
        return 0.0, 0.0, v
    s = (maxc-minc) / maxc
    rc = (maxc-r) / (maxc-minc)
    gc = (maxc-g) / (maxc-minc)
    bc = (maxc-b) / (maxc-minc)
    if r == maxc:
        h = bc-gc
    elif g == maxc:
        h = 2.0+rc-bc
    else:
        h = 4.0+gc-rc
    h = (h/6.0) % 1.0
    return h, s, v

def hsv_to_rgb(h, s, v):
    if s == 0.0:
        return v, v, v
    i = int(h*6.0) # XXX assume int() truncates!
    f = (h*6.0) - i
    p = v*(1.0 - s)
    q = v*(1.0 - s*f)
    t = v*(1.0 - s*(1.0-f))
    i = i%6
    if i == 0:
        return v, t, p
    if i == 1:
        return q, v, p
    if i == 2:
        return p, v, t
    if i == 3:
        return p, q, v
    if i == 4:
        return t, p, v
    if i == 5:
        return v, p, q
    # Cannot get here
点赞

发表评论

电子邮件地址不会被公开。 必填项已用*标注