Sunday 2 March 2014

Python で RGB と HSV の相互変換するスクリプト書いた

……はずだった.いや書いたんだけど.

Python で手軽に使えて色々便利なモジュールといえばそのうちの一つは PIL.
numpy と組み合わせるとさくっと色々できたりする.

僕 「!! そうだ RGB と HSV 変換したいな」
僕 「そういえばどう変換するんだっけ」

https://en.wikipedia.org/wiki/HSL_and_HSV

僕「なるほど(ジッサイ詳しい」


書いた

#!/usr/bin/env python3
# coding: utf-8
# see : https://en.wikipedia.org/wiki/HSL_and_HSV

"""
r,g,b : [0,1]
h : hue : [0,360)
s,v,l : [0,1]
"""

def rgb_to_hue(r,g,b):
    M = max(r,g,b)
    m = min(r,g,b)
    c = M - m  # chroma.

    if c == 0:
        return None  # undefined.
    elif r == M:
        h2 = (g-b)/c % 6
    elif g == M:
        h2 = (b-r)/c + 2
    else:
        h2 = (r-g)/c + 4

    return 60*h2

def rgb_to_hsv(r,g,b):
    hue = rgb_to_hue(r,g,b)
    c = max(r,g,b) - min(r,g,b)
    val = max(r,g,b)
    sat = 0 if c == 0 else c/val
    return(hue,sat,val)


def hsv_to_rgb(h,s,v):
    """
    h <- [0,360), s <- [0,1], v <- [0,1]
    => (r,g,b) <- [0,1]**3
    """
    c = v*s  # chroma
    m = v-c
    if h is None:
        return(m,m,m)
    h2 = h/60
    x = c*(1-abs(h2 % 2 -1))
    h2 = int(h2)

    if h2 == 0:
        (r1,g1,b1) = (c,x,0)
    elif h2 == 1:
        (r1,g1,b1) = (x,c,0)
    elif h2 == 2:
        (r1,g1,b1) = (0,c,x)
    elif h2 == 3:
        (r1,g1,b1) = (0,x,c)
    elif h2 == 4:
        (r1,g1,b1) = (x,0,c)
    elif h2 == 5:
        (r1,g1,b1) = (c,0,x)

    return (r1+m, g1+m, b1+m)
素直に書き写しただけやけどこれで動く(はず).

僕「ついでに HSL の方も書くか」
僕「ちょっと待てよ…」(グーグル

>>>> http://docs.python.org/3.3/library/colorsys.html <<<<

>>>>> Conversions between color systems <<<<<

>>>>>> 標準ライブラリ <<<<<<


ありがとうございました.

No comments:

Post a Comment