# -*- coding: utf-8 -*-

import os
os.chdir(r"D:\Documents(D)\Bellevue\1-Informatique\0 - Programme 2021\Semestre_1_TP\TP8 - Traitement d'images\Programmes\images")

"""affichage stade"""
#bibliotheque image
import numpy as np
import scipy.misc as scm
from PIL import Image

image=scm.imread("moi.jpg") #stocker l'image dans une variable
imshow(image)

print (image) #donne le nombre de pixels de l'image

dim_long=image.shape[1]  #taille de l'image
dim_larg=image.shape[0]  #taille de l'image

def coul(image):
    coul_ter=image[int(dim_long/2)-2,int(dim_long/2)] 
    # on assure le milieu avec partie entiere et on decale de 2 pixels
    return (coul_ter)
print(coul(image))

def filtrer1(filtreA,matB):
    nA=filtreA.shape[0] #matrice carree, donc shape[0]=shape[1]
    nb_ligneB=matB.shape[0]
    nb_colonneB=matB.shape[1]
    C=matB.copy()
    bordure =nA//2
    for i in range(bordure,nb_ligneB-bordure):
        for j in range(bordure,nb_colonneB-bordure):
            Bij=matB[i-bordure:i+bordure+1,j-bordure:j+bordure+1]
            C[i,j]=sum(matA*Bij) #on considère que tout numpy est importé
    return C

print(type(image))
A=array([[1./9.,1./9.,1./9.],[1./9.,1./9.,1./9.],[1./9.,1./9.,1./9.]])
print(A,type(image))

def filtrer(filtreA,matB):
    taille=filtreA.shape[0] #matrice carree, donc shape[0]=shape[1]
    bordure=taille//2
    nb_lig,nb_col,nb_coul=matB.shape
    matC=np.int32(np.copy(matB))  # il faut normalement forcer le type int32 
    for i in range(bordure,nb_lig-bordure):
        for j in range(bordure,nb_col-bordure):
            for k in range(3): #ou nb_coul
                Bij=matB[i-bordure:i+bordure+1,j-bordure:j+bordure+1,k]
                matC[i,j,k]=sum(filtreA*Bij)
    return matC

C=filtrer(A,image)

#print(dim_long,dim_larg)
#imshow(C)


def symetrie(matB):
    nb_lig,nb_col,nb_coul=matB.shape
    matC=np.zeros((nb_lig,nb_col,nb_coul))
    for i in range(nb_lig):
        for j in range(nb_col):
            for k in range(nb_coul):
                matC[i,j,k]=matB[i,nb_col-j-1,k]
    return matC


def rotation2(t): #rotation angle pi/2 
    n,p=np.shape(t)
    tt=np.zeros((p,n))
    for i in range(p):
        for j in range(n):
          tt[i,j]=t[j,p-1-i]
    return tt
def rotation(matB):
    nb_lig,nb_col,nb_coul=matB.shape
    matC=np.zeros((nb_col,nb_lig,nb_coul))
    for i in range(nb_lig):
        for j in range(nb_col):
            for k in range(nb_coul):
                matC[j,i,k]=matB[i,j,k]
    return matC    
    
def niveau_gris(matB):
    nb_lig,nb_col,nb_coul=matB.shape
    matC=np.zeros((nb_lig,nb_col,nb_coul))
    for i in range(nb_lig):
        for j in range(nb_col):
            sum=0
            for k in range(nb_coul):
                sum+=matB[i,j,k]
            moy=int(sum/nb_coul)
            for k in range(nb_coul):
                matC[i,j,k]=moy
    return matC 

def niveau_gris_norme(matB):
    nb_lig,nb_col,nb_coul=matB.shape
    matC=np.zeros((nb_lig,nb_col,nb_coul))
    for i in range(nb_lig):
        for j in range(nb_col):
            gris=int(0.2125*matB[i,j,0]+0.7154*matB[i,j,1]+0.0721*matB[i,j,2])
            for k in range(nb_coul):
                matC[i,j,k]=gris
    return matC

def contour(matB):
   nb_lig,nb_col,nb_coul=matB.shape
   matC=np.zeros((nb_lig,nb_col,nb_coul))
   for i in range(2,nb_lig-2):
       for j in range(2,nb_col-2):
           p1=matC[i-2,j,0]
           p2=matC[i,j-2,0]            
           p3=matC[i+2,j,0]            
           p4=matC[i,j+2,0]
           norme=int(sqrt((p1-p3)**2+(p2-p4)**2)/2)
           print(norme,1)
           seuil=150       
           if norme < seuil:
               p = 255
           else:
               p = 0               
           for k in range(nb_coul):
               matC[i,j,k]=p
   return matC
C=niveau_gris(image)
D=contour(C)
print(D)
imshow(D)
