#############################
## Programme du 13/11/2019 ##
## valable pour python 3.4 ##
##   Julien BARTHES        ##
#############################

import PIL
import numpy as np
import PIL.ImageOps
import matplotlib.pyplot as plt
from PIL import Image
plt.close("all")


def extraction_image(nomFichier):
    '''
    retourne l'image en niveaus de gris sous forme de tableau
    '''

    img = Image.open(nomFichier)
    return  np.array(img)[:,:,:].tolist()


def change_couleur(img):
    '''
    retourne l'image sous forme de tableau
    '''
    l,h = len(img),len(img[0])
    img_2 = [[0 for j in range(h)] for i in range(l)]
    for i in range(l):
        for j in range(h):
            img_2[i][j] = [ img[i][j][2],img[i][j][0],img[i][j][1] ]
    return img_2

def symetrique(img):
    '''
    retourne l'image sous forme de tableau
    '''
    l,h = len(img),len(img[0])
    img_2 = [[0 for j in range(h)] for i in range(l)]
    for i in range(l):
        for j in range(h//2):
            img_2[i][j] = img[i][h-1-j]
            img_2[i][h-1-j] = img[i][h-1-j]
    return img_2

def reduction(img,alpha):
    '''
    retourne l'image sous forme de tableau
    '''
    l,h = len(img),len(img[0])
    l2,h2 = int(alpha*len(img)), int(alpha*len(img[0]))
    img_2 = [[0 for j in range(h2)] for i in range(l2)]
    pas_i,pas_j = int(l/l2),int(h/h2)
    for i in range(l2):
        for j in range(h2):
            img_2[i][j] = img[pas_i*i][ pas_j*j]
    return img_2


##    exemple TEST
img = extraction_image('grenouille.jpg')


plt.figure(1)
plt.subplot(221)
plt.imshow(img)
plt.title('image orginelle')

plt.subplot(222)
img_2 = change_couleur(img)
plt.imshow(img_2)
plt.title('R=B,V=R,B=V')

plt.subplot(223)
img_3 = symetrique(img)
plt.imshow(img_3)
plt.title('Effet miroir')

plt.subplot(224)
img_4 = reduction(img,0.1)
plt.imshow(img_4)
plt.title('image réduite')

plt.show()

## Deuxième partie

def moyenne_couleur(img,i,j,N):
    '''
    retourne l'image sous forme de tableau
    '''
    l,h = len(img),len(img[0])
    valeurs = [0,0,0]
    for n in range(i-N//2,i+N//2+1):
        for m in range(j-N//2,j+N//2+1):
            for c in range(3):
                valeurs[c] += img[n][m][c]
    return [ int(v/N**2) for v in valeurs]

def flou(img,N):
    l,h = len(img),len(img[0])
    img_2 = [[[0,0,0] for j in range(h)] for i in range(l)]
    for i in range(N//2,l-N//2):
        for j in range(N//2,h-N//2):
            img_2[i][j] = moyenne_couleur(img,i,j,N)
    return img_2

plt.figure(2)
plt.subplot(121)
plt.imshow(img_4)
plt.title('image de départ')
plt.subplot(122)
img_5 = flou(img_4,3)
plt.imshow(img_5)
plt.title('image floutée')

plt.show()




## rotation
from math import cos,sin
img = extraction_image('terre.jpg')
l,h = len(img),len(img[0])

i_c,j_c = l//2,h//2

def rotation(img,theta):
    img_2 = [[[0,0,0] for j in range(h)] for i in range(l)]
    for i in range(l):
        for j in range(h):
            i2 = i_c + int(cos(theta)*(i-i_c)+sin(theta)*(j-j_c))
            j2 = j_c+ int(cos(theta)*(j-j_c)-sin(theta)*(i-i_c))
            if 0<=i2<l and 0<=j2<h:
                img_2[i][j] = img[i2][j2]
    return img_2


plt.figure(3)
for i in range(5):
    ind_subplot=151+i
    plt.subplot(ind_subplot)
    plt.imshow(rotation(img,0.3*i))
    plt.axis('off')
plt.show()


