
import numpy
import math
import scipy.signal
from matplotlib.pyplot import *


# Lissage d'une image
def filtrePasseBas(P,epsilon):
    sigma = P*1.0/math.sqrt(-2*math.log(epsilon))
    h = numpy.zeros((2*P+1,2*P+1))
    som = 0
    for m in range(-P,P+1):
        for n in range(-P,P+1):
            h[m+P][n+P] = math.exp(-(n*n+m*m)/(2*sigma*sigma))
            som += h[m+P][n+P]
    h = h/som
    return h

P1=2
h1 = filtrePasseBas(P1,0.05)
w,g=scipy.signal.freqz(h1[P1])
figure()
plot(w/(2*numpy.pi),numpy.absolute(g))
xlabel("f/fe")
ylabel("G")
grid()

img = imread("objets.png")
rouge = img[:,:,0]
figure()
subplot(121)
imshow(rouge,cmap='gray',vmin=0,vmax=1)
subplot(122)
rouge_floue = scipy.signal.convolve(rouge,h1,mode='same')
imshow(rouge_floue,cmap='gray',vmin=0,vmax=1)


P2=4
h2 = filtrePasseBas(P2,0.05)
w,g=scipy.signal.freqz(h2[P2])
figure()
plot(w/(2*numpy.pi),numpy.absolute(g))
xlabel("f/fe")
ylabel("G")
grid()

img = imread("objets.png")
rouge = img[:,:,0]
figure()
subplot(121)
imshow(rouge,cmap='gray',vmin=0,vmax=1)
subplot(122)
rouge_floue = scipy.signal.convolve(rouge,h2,mode='same')
imshow(rouge_floue,cmap='gray',vmin=0,vmax=1)                  


# Accentuation de netteté

img=imread("saintmichel.png")
A = img[:,:,0]
P=3
h = filtrePasseBas(P,0.05)
B = scipy.signal.convolve(A,h,mode='same')
C = A-B
a=1.5
D=A+a*C
figure()
subplot(131)
imshow(A,cmap='gray',vmin=0,vmax=1)
subplot(132)
imshow(C,cmap='gray',vmin=-0.1,vmax=0.1)
subplot(133)
imshow(D,cmap='gray',vmin=0,vmax=1)

def accentuation(A,P,a,seuil):
    h = filtrePasseBas(P,0.05)
    B = scipy.signal.convolve(A,h,mode='same')
    C = A-B
    D=A.copy()
    (I,J)=D.shape
    for i in range(I):
        for j in range(J):
            if C[i,j] > seuil:
                D[i,j] += a*C[i,j]
                if D[i,j]<0 : D[i,j]=0
                elif D[i,j]>1 : D[i,j]=1
    return(D)

def accentuation_rvb(image,fichier,P,a,seuil):
    rouge = image[:,:,0]
    vert = image[:,:,1]
    bleu = image[:,:,2]
    image_accent = image.copy()
    image_accent[:,:,0] = accentuation(rouge,P,a,seuil)
    image_accent[:,:,1] = accentuation(vert,P,a,seuil)
    image_accent[:,:,2] = accentuation(bleu,P,a,seuil)
    imsave(fichier,image_accent)

accentuation_rvb(img,"saintmichel-accent.png",3,1.5,0)


# Filtre dérivateur
def filtreDerivateur(P,epsilon,d):
    sigma = P*1.0/math.sqrt(2*(math.log(P)-math.log(epsilon)))
    h = numpy.zeros((2*P+1,2*P+1))
    som_plus = 0.0
    som_moins = 0.0
    for m in range(-P,P+1):
        for n in range(-P,P+1):
            u = (d[0]*n+d[1]*m)*math.exp(-(n*n+m*m)/(2*sigma*sigma))
            h[m+P][n+P] = u 
            if u>0:
                som_plus += u
            elif u<0:
                som_moins += abs(u)
    for m in range(-P,P+1):
        for n in range(-P,P+1):
            if h[m+P][n+P]>0:
                h[m+P][n+P] /= som_plus
            elif h[m+P][n+P]<0:
                h[m+P][n+P] /= som_moins
    return h
                    

P3=4
h3 = filtreDerivateur(P3,0.05,[1,0])
w,g=scipy.signal.freqz(h3[P3])
figure()
plot(w/(2*numpy.pi),numpy.absolute(g))
xlabel("f/fe")
ylabel("G")
grid()


img = imread("objets.png")
rouge = img[:,:,0]
figure()
subplot(121)
imshow(rouge,cmap='gray',vmin=0,vmax=1)
subplot(122)
rouge_floue = scipy.signal.convolve(rouge,h3,mode='same')
imshow(rouge_floue,cmap='gray',vmin=0,vmax=0.5)

sobel_x = numpy.array([[-1,0,1],[-2,0,2],[-1,0,1]])
figure()
subplot(121)
imshow(rouge,cmap='gray',vmin=0,vmax=1)
subplot(122)
rouge_floue = scipy.signal.convolve(rouge,sobel_x,mode='same')
imshow(rouge_floue,cmap='gray',vmin=0,vmax=1)


show()
                
