86 lines
2.4 KiB
Python
86 lines
2.4 KiB
Python
########################################################################
|
|
# Filter Api #
|
|
########################################################################
|
|
|
|
import string
|
|
import time
|
|
|
|
import numpy as np
|
|
import scipy
|
|
|
|
import config
|
|
|
|
|
|
class MakeBrightnessFilter:
|
|
def __init__(self, intensity):
|
|
self.intensity = intensity
|
|
|
|
def __call__(self, img):
|
|
return (img * self.intensity).astype(np.uint8)
|
|
|
|
|
|
def FlipXFilter(intensity):
|
|
return intensity[:, ::-1, :]
|
|
|
|
|
|
def FlipYFilter(intensity):
|
|
return intensity[::-1, :, :]
|
|
|
|
|
|
class MakeBrightnessImageFilter:
|
|
def __init__(self, name):
|
|
self.filter_img = scipy.misc.imread("filter/" + name + ".png", flatten=True) / 255
|
|
# img = np.transpose(img)
|
|
|
|
def __call__(self, img):
|
|
img = img.astype(float)
|
|
for i in range(img.shape[2]):
|
|
img[:, :, i] *= self.filter_img
|
|
return img.astype(np.uint8)
|
|
|
|
|
|
def strings(s):
|
|
allowed_chars = string.ascii_letters + string.digits + "+-*/()."
|
|
i = 0
|
|
outlist = []
|
|
while i < len(s):
|
|
if s[i] not in allowed_chars:
|
|
raise Exception("Unexpected char " + s[i])
|
|
if s[i] not in string.ascii_letters:
|
|
i += 1
|
|
continue
|
|
out = ""
|
|
while i < len(s) and s[i] in string.ascii_letters + string.digits:
|
|
out += s[i]
|
|
i += 1
|
|
outlist.append(out)
|
|
return outlist
|
|
|
|
|
|
def eval_safer(expr, x, y, t):
|
|
symbols = {"x": x, "y": y, "t": t,
|
|
"sin": np.sin, "cos": np.cos, "exp": np.exp, "tan": np.tan}
|
|
strs = strings(expr)
|
|
for s in strs:
|
|
if s not in symbols.keys():
|
|
raise Exception(f"Unexpected symbol: {s}")
|
|
return eval(expr, {}, symbols)
|
|
|
|
|
|
class MakeBrightnessExprFilter:
|
|
def __init__(self, expr: str):
|
|
self.expr = expr.replace(" ", "")
|
|
self.t0 = time.time()
|
|
self.x, self.y = np.meshgrid(np.arange(config.ScreenX), np.arange(config.ScreenY))
|
|
|
|
eval_safer(self.expr, 0, 0, 0) # check expression
|
|
|
|
def __call__(self, img):
|
|
t = time.time() - self.t0
|
|
img = img.astype(float)
|
|
filter_ = 0 * self.x + eval_safer(self.expr, self.x, self.y, t)
|
|
filter_ = np.clip(np.nan_to_num(filter_), 0, 1)
|
|
for i in range(img.shape[2]):
|
|
img[:, :, i] *= filter_
|
|
return img.astype(np.uint8)
|