import numpy as np
from PIL import Image

##Exercice 1
#Liste -> tableau Numpy
M = np.array([[1, 5, 4, 2], [3, 2, 5, 7], [1, 3, 4, 6]])
print(M)

#Tableau Numpy rempli de zéros
M2 = np.zeros([20,20])
print(M2)

#Taille du tableau
n, p = np.shape(M)
#Ou
n = len(M)
p = len(M[0])

#Modification du tableau
M[2, 1] = 7
print(M)


##Exercice 2
def sommeli(M, i):
    somme = 0
    n,p = np.shape(M)
    for j in range(p):
        somme += M[i,j]
    return somme


#Variante
def sommeli(M, i):
    somme = 0
    for x in M[i]:
        somme += x
    return somme

tab = np.array([[2,7],[1,4],[5,9]])
s = sommeli(tab,0)
print(s)


##Exercice 4
def matid(n):

    M = np.zeros([n,n])

    for i in range(n):
        M[i,i] = 1

    return M

print(matid(5))
print(np.eye(5))

##Exercice 5.2
I=Image.open('Fleur.png')
M = np.array(I)

def negatif(M):
    n, p = np.shape(M)
    N = np.zeros([n,p])
    for i in range(n):
        for j in range(p):
            N[i,j] = 255 - M[i,j]

    return N

#Variante
def negatif(M):
    return 255 - M


N = negatif(M)
J = Image.fromarray(N)
J.show()

##Exercice 5.3
def retournement(M):
    n,p = np.shape(M)
    N = np.zeros((n,p))

    for i in range(n):
        for j in range(p):
            N[i,j] = M[-1-i,j]

    return N

N = retournement(M)
J = Image.fromarray(N)
J.show()

##Exercice 5.4
def pivoter90(M):
    n,p = np.shape(M)
    N = np.zeros((p,n)) #On inverse

    for i in range(p):
        for j in range(n):
            N[i,j] = M[j,-1-i]

    return N

N = pivoter90(M)
J = Image.fromarray(N)
J.show()


##Exercice 5.5
def filtre(C,M):
    n,p = np.shape(M)
    N = np.zeros((n,p))

    for i in range(n):
        for j in range(p):
            #Cas des bords
            if i == 0 or i == n-1 or j == 0 or j == p-1 :
                N[i,j] = M[i,j]
            #Cas général
            else :
                #Variante 0
                N[i,j] = C[0,0]*M[i-1,j-1]+C[0,1]*M[i-1,j]+C[0,2]*M[i-1,j+1]+C[1,0]*M[i,j-1]+C[1,1]*M[i,j]+C[1,2]*M[i,j+1]+C[2,0]*M[i+1,j-1]+C[2,1]*M[i+1,j]+C[2,2]*M[i+1,j+1]

                #Variante 1
                somme = 0
                for k in range(3):
                    for l in range(3):
                        somme += C[k,l]*M[i-1+k,j-1+l]
                N[i,j] = somme

                #Variante2
                N[i,j] = np.sum(C*M[i-1:i+2,j-1:j+2])

    return N

#Passe-bas
C_PB = 1/np.array([[16, 8, 16],[8, 4, 8],[16, 8, 16]])
#Passe-haut
C_PH = np.zeros((3,3))-1  #Juste une variante, on peut se contenter de recopier les différents coefficients indiqués
C_PH[1,1] = 8


N = filtre(C_PB,M)
J = Image.fromarray(N)
J.show()


N = filtre(C_PH,M)
J = Image.fromarray(N)
J.show()



