62 lines
1.4 KiB
Python
62 lines
1.4 KiB
Python
|
import math
|
||
|
|
||
|
def rgb2hsv(r, g, b):
|
||
|
_min = float(min(r, g, b))
|
||
|
_max = float(max(r, g, b))
|
||
|
v = _max
|
||
|
delta = _max - _min
|
||
|
if delta != 0.0:
|
||
|
s = delta / _max
|
||
|
else:
|
||
|
s = 0.0
|
||
|
h = -1.0
|
||
|
return (h, s, v)
|
||
|
if r == _max:
|
||
|
h = (g - b) / delta
|
||
|
elif g == _max:
|
||
|
h = 2.0 + (b - r) / delta
|
||
|
else:
|
||
|
h = 4.0 + (r - g) / delta
|
||
|
h *= 60.0
|
||
|
if h < 0.0:
|
||
|
h += 360.0
|
||
|
return (h, s, v)
|
||
|
|
||
|
|
||
|
def hsv2rgb(h, s, v):
|
||
|
if s == 0.0:
|
||
|
return (v, v, v)
|
||
|
h %= 360.0
|
||
|
h /= 60.0
|
||
|
i = int(math.floor(h))
|
||
|
f = h - i
|
||
|
p = v * (1.0 - s)
|
||
|
q = v * (1.0 - s * f)
|
||
|
t = v * (1.0 - s * (1.0 - f))
|
||
|
if i == 0:
|
||
|
return (v, t, p)
|
||
|
elif i == 1:
|
||
|
return (q, v, p)
|
||
|
elif i == 2:
|
||
|
return (p, v, t)
|
||
|
elif i == 3:
|
||
|
return (p, q, v)
|
||
|
elif i == 4:
|
||
|
return (t, p, v)
|
||
|
else:
|
||
|
return (v, p, q)
|
||
|
|
||
|
|
||
|
def rgb2yuv(r, g, b):
|
||
|
y = 0.299 * r + 0.587 * g + 0.114 * b
|
||
|
u = -.169 * r - 0.331 * g + 0.5 * b + 0.5
|
||
|
v = 0.5 * r - 0.419 * g - 0.081 * b + 0.5
|
||
|
return tuple(map(lambda x: min(max(x, 0), 1), (y, u, v)))
|
||
|
|
||
|
|
||
|
def yuv2rgb(y, u, v):
|
||
|
r = y - 0.0009267 * (u - 0.5) + 1.4016868 * (v - 0.5)
|
||
|
g = y - 0.3436954 * (u - 0.5) - 0.714169 * (v - 0.5)
|
||
|
b = y + 1.7721604 * (u - 0.5) + 0.0009902 * (v - 0.5)
|
||
|
return tuple(map(lambda x: min(max(x, 0), 1), (r, g, b)))
|