#!/usr/bin/python

import os,sys,Image,ImageFilter,math,numarray

#the aim of this programm is to create a filter representing the vignetting a photo

		
def d(x,y):
	return  int(round(math.sqrt(x*x+y*y)))

def mean(arr):
	s=0
	for i in arr: s+=i
	return 1.0*s/len(arr)

def Gaussian(radius):
	"returns a table of 4*radius+1 representing the gaussian function"
	t=[0.0]*(4*radius+1)
	for i in range(4*radius+1):
		t[i]=math.exp(-1.0*(i-2*radius)**2/radius**2)	

	s=0
	for i in t:
		s+=i
	return numarray.array(t)/s

def GaussianBlur(data,radius):
	"""Does the Gaussian Blur in one dimension of the data"""
	G=Gaussian(radius)
	tx = ([ data[0] ] * (2*radius))  + list(data) + ([ data[-2] ] * (radius*2) )
	rx = []
	for i in range(radius*2,len(tx)-(radius*2)):
		rx.append(numarray.matrixmultiply(G,numarray.array(tx[i-(2*radius):i+1+2*radius])))
	return rx
	

if len(sys.argv)==2:
	filename=sys.argv[1]
else:
	filename="11h30m14-u300D.jpg"

print "Loading the image"

try:
	I=Image.open(filename)
except:
	raise "error in reading file : "+filename

J=I.convert("RGB")
(x,y)=I.size
xm=x/2
ym=y/2
#F=Image.new("RGB", I.size, (255,255,255))
F=Image.new("L", I.size, 255)


print "Getting the pixels"
r={}
g={}
b={}
v={} # valeur dans le sens TSV
for i in range(d(xm,ym)+1):
	v[i]=[]
#	r[i]=[]
#	g[i]=[]
#	b[i]=[]

for l in range(10):
	for i in range(x):
		v[d(i-xm,l-ym)].append(max(J.getpixel((i,l))))
		#u,v,w=J.getpixel((i,l))
		#r[d(i-xm,l-ym)].append(u)
		#g[d(i-xm,l-ym)].append(v)
		#b[d(i-xm,l-ym)].append(w)

#R=[0]*(d(xm,ym)+1)
#G=[0]*(d(xm,ym)+1)
#B=[0]*(d(xm,ym)+1)
V=[0]*(d(xm,ym)+1)

print "Averaging the pixels"

for i in range(len(V)):	
	if len(v[i])>0:V[i]=mean(v[i])
#	if len(r[i])>0:R[i]=mean(r[i])
#	if len(g[i])>0:G[i]=mean(g[i])
#	if len(b[i])>0:B[i]=mean(b[i])
mv=max(V)
#mr=max(R)
#mg=max(G)
#mb=max(B)

for i in range(d(xm,ym)+1):
	if V[i]==0:V[i]=mv
#	if R[i]==0:R[i]=mr
#	if G[i]==0:G[i]=mg
#	if B[i]==0:B[i]=mb	

print "Bluring the data"
v=GaussianBlur(numarray.array(V)*255.0/mv,50)
#r=GaussianBlur(numarray.array(R)*255.0/mr,50)
#g=GaussianBlur(numarray.array(G)*255.0/mg,50)		
#b=GaussianBlur(numarray.array(B)*255.0/mb,50)

f=open("test.dat","w")
for i in range(len(V)):
	f.write("%s %s	%s	\n"%(i,v[i],V[i]))
f.close()

print "Generating the mask"

for i in range(x):
	for j in range(y):
		dist=d(i-xm,j-ym)
#		if r[dist]<255 or g[dist]<255 or b[dist]<255:
#			F.putpixel((i,j),(int(r[dist]),int(g[dist]),int(b[dist])))
		if v[dist]<255:
			F.putpixel((i,j),(int(v[dist])))
print "Saving the mask"
F.save("filter.png")
