# Path: opc/nphue.py
# @timefunc
# def rgb_to_hsv(rgb):
#     # Translated from source of colorsys.rgb_to_hsv
#     # r,g,b should be a numpy arrays with values between 0 and 255
#     # rgb_to_hsv returns an array of floats between 0.0 and 1.0.
#     rgb = rgb.astype('float')
#     hsv = np.zeros_like(rgb)
#     # in case an RGBA array was passed, just copy the A channel
#     hsv[..., 3:] = rgb[..., 3:]
#     r, g, b = rgb[..., 0], rgb[..., 1], rgb[..., 2]
#     maxc = np.max(rgb[..., :3], axis=-1)
#     minc = np.min(rgb[..., :3], axis=-1)
#     hsv[..., 2] = maxc
#     mask = maxc != minc
#     hsv[mask, 1] = (maxc - minc)[mask] / maxc[mask]
#     rc = np.zeros_like(r)
#     gc = np.zeros_like(g)
#     bc = np.zeros_like(b)
#     rc[mask] = (maxc - r)[mask] / (maxc - minc)[mask]
#     gc[mask] = (maxc - g)[mask] / (maxc - minc)[mask]
#     bc[mask] = (maxc - b)[mask] / (maxc - minc)[mask]
#     hsv[..., 0] = np.select(
#         [r == maxc, g == maxc],
#         [bc - gc, 2.0 + rc - bc], default=4.0 + gc - rc)
#     hsv[..., 0] = (hsv[..., 0] / 6.0) % 1.0
#     return hsv
# 
# @timefunc
# def hsv_to_rgb(hsv):
#     # Translated from source of colorsys.hsv_to_rgb
#     # h,s should be a numpy arrays with values between 0.0 and 1.0
#     # v should be a numpy array with values between 0.0 and 255.0
#     # hsv_to_rgb returns an array of uints between 0 and 255.
#     rgb = np.empty_like(hsv)
#     rgb[..., 3:] = hsv[..., 3:]
#     h, s, v = hsv[..., 0], hsv[..., 1], hsv[..., 2]
#     i = (h * 6.0).astype('uint8')
#     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
#     conditions = [s == 0.0, i == 1, i == 2, i == 3, i == 4, i == 5]
#     rgb[..., 0] = np.select(conditions, [v, q, p, p, t, v], default=v)
#     rgb[..., 1] = np.select(conditions, [v, v, v, q, p, p], default=t)
#     rgb[..., 2] = np.select(conditions, [v, p, t, v, v, q], default=p)
#     return rgb.astype('uint8')
# 
# Path: opc/utils/prof.py
# def timefunc(f, reference=False):
#     global records
# 
#     records[f.__name__] = Record(f.__name__, reference)
# 
#     @wraps(f)
#     def f_timer(*args, **kwargs):
#         global active
# 
#         if not active:
#             return f(*args, **kwargs)
# 
#         start = time.time()
#         result = f(*args, **kwargs)
#         end = time.time()
# 
#         records[f.__name__].addTime(end-start)
# 
#         return result
# 
#     return f_timer


import numpy as np
from ..nphue import rgb_to_hsv, hsv_to_rgb
from ..utils.prof import timefunc




DTYPE = np.uint8


class Filter(object):

    @timefunc
    def maskbelow(self, thresh, color):
        """
        Set (r, g, b) values below an average value of thresh
        to value
        """
        keys = np.mean(self.buf.buf,2)<thresh
        self.buf.buf[keys] = color


# Path: opc/nphue.py
# @timefunc
# def rgb_to_hsv(rgb):
#     # Translated from source of colorsys.rgb_to_hsv
#     # r,g,b should be a numpy arrays with values between 0 and 255
#     # rgb_to_hsv returns an array of floats between 0.0 and 1.0.
#     rgb = rgb.astype('float')
#     hsv = np.zeros_like(rgb)
#     # in case an RGBA array was passed, just copy the A channel
#     hsv[..., 3:] = rgb[..., 3:]
#     r, g, b = rgb[..., 0], rgb[..., 1], rgb[..., 2]
#     maxc = np.max(rgb[..., :3], axis=-1)
#     minc = np.min(rgb[..., :3], axis=-1)
#     hsv[..., 2] = maxc
#     mask = maxc != minc
#     hsv[mask, 1] = (maxc - minc)[mask] / maxc[mask]
#     rc = np.zeros_like(r)
#     gc = np.zeros_like(g)
#     bc = np.zeros_like(b)
#     rc[mask] = (maxc - r)[mask] / (maxc - minc)[mask]
#     gc[mask] = (maxc - g)[mask] / (maxc - minc)[mask]
#     bc[mask] = (maxc - b)[mask] / (maxc - minc)[mask]
#     hsv[..., 0] = np.select(
#         [r == maxc, g == maxc],
#         [bc - gc, 2.0 + rc - bc], default=4.0 + gc - rc)
#     hsv[..., 0] = (hsv[..., 0] / 6.0) % 1.0
#     return hsv
# 
# @timefunc
# def hsv_to_rgb(hsv):
#     # Translated from source of colorsys.hsv_to_rgb
#     # h,s should be a numpy arrays with values between 0.0 and 1.0
#     # v should be a numpy array with values between 0.0 and 255.0
#     # hsv_to_rgb returns an array of uints between 0 and 255.
#     rgb = np.empty_like(hsv)
#     rgb[..., 3:] = hsv[..., 3:]
#     h, s, v = hsv[..., 0], hsv[..., 1], hsv[..., 2]
#     i = (h * 6.0).astype('uint8')
#     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
#     conditions = [s == 0.0, i == 1, i == 2, i == 3, i == 4, i == 5]
#     rgb[..., 0] = np.select(conditions, [v, q, p, p, t, v], default=v)
#     rgb[..., 1] = np.select(conditions, [v, v, v, q, p, p], default=t)
#     rgb[..., 2] = np.select(conditions, [v, p, t, v, v, q], default=p)
#     return rgb.astype('uint8')
# 
# Path: opc/utils/prof.py
# def timefunc(f, reference=False):
#     global records
# 
#     records[f.__name__] = Record(f.__name__, reference)
# 
#     @wraps(f)
#     def f_timer(*args, **kwargs):
#         global active
# 
#         if not active:
#             return f(*args, **kwargs)
# 
#         start = time.time()
#         result = f(*args, **kwargs)
#         end = time.time()
# 
#         records[f.__name__].addTime(end-start)
# 
#         return result
# 
#     return f_timer


# Path: opc/matrix/filter.py
import numpy as np
from ..nphue import rgb_to_hsv, hsv_to_rgb
from ..utils.prof import timefunc





DTYPE = np.uint8


class Filter(object):

    @timefunc
    def maskbelow(self, thresh, color):
        """
        Set (r, g, b) values below an average value of thresh
        to value
        """
        keys = np.mean(self.buf.buf,2)<thresh
        self.buf.buf[keys] = color


    @timefunc