Skip to content
Find file
66016a7 Aug 6, 2015
Vassilis Update
121 lines (90 sloc) 3.02 KB
The extraction of the curves from the acv files are from here:
from struct import unpack
from scipy import interpolate
from PIL import Image
import numpy
import scipy
import sys
class Filter:
def __init__(self, acv_file_path, name): = name
with open(acv_file_path, 'rb') as acv_file:
self.curves = self._read_curves(acv_file)
self.polynomials = self._find_coefficients()
def _read_curves(self, acv_file):
_, nr_curves = unpack('!hh',
curves = []
for i in xrange(0, nr_curves):
curve = []
num_curve_points, = unpack('!h',
for j in xrange(0, num_curve_points):
y, x = unpack('!hh',
return curves
def _find_coefficients(self):
polynomials = []
for curve in self.curves:
xdata = [x[0] for x in curve]
ydata = [x[1] for x in curve]
p = interpolate.lagrange(xdata, ydata)
return polynomials
def get_r(self):
return self.polynomials[1]
def get_g(self):
return self.polynomials[2]
def get_b(self):
return self.polynomials[3]
def get_c(self):
return self.polynomials[0]
class FilterManager:
def __init__(self):
self.filters = {}
#add some stuff here
def add_filter(self,filter_obj):
# Overwrites if such a filter already exists
# NOTE: Fix or not to fix?
self.filters[] = filter_obj
def apply_filter(self,filter_name,image_array):
if image_array.ndim < 3:
raise Exception('Photos must be in color, meaning at least 3 channels')
def interpolate(i_arr, f_arr, p, p_c):
p_arr = p_c(f_arr)
return p_arr
# NOTE: Assumes that image_array is a numpy array
image_filter = self.filters[filter_name]
# NOTE: What happens if filter does not exist?
width,height,channels = image_array.shape
filter_array = numpy.zeros((width, height, 3), dtype=float)
p_r = image_filter.get_r()
p_g = image_filter.get_g()
p_b = image_filter.get_b()
p_c = image_filter.get_c()
filter_array[:,:,0] = p_r(image_array[:,:,0])
filter_array[:,:,1] = p_g(image_array[:,:,1])
filter_array[:,:,2] = p_b(image_array[:,:,2])
filter_array = filter_array.clip(0,255)
filter_array = p_c(filter_array)
filter_array = numpy.ceil(filter_array).clip(0,255)
return filter_array.astype(numpy.uint8)
if __name__ == '__main__':
if len(sys.argv) < 3:
print "Wrong number of arguments"
print """ Usage: \
python [curvefile] [imagefile] """
img_filter = Filter(sys.argv[1], 'crgb')
im =[2])
image_array = numpy.array(im)
filter_manager = FilterManager()
filter_array = filter_manager.apply_filter('crgb', image_array)
im = Image.fromarray(filter_array)'temp.png')
Something went wrong with that request. Please try again.