## À exécuter une fois pour toute
import matplotlib.pyplot as plt
import matplotlib.image as mpimg


# changement du répertoire de travail si les images ne sont pas trouvées même avec Ctrl+F5
# Si besoin décommenter les trois lignes suivantes
# import os
# dossier_images = "chemin/vers/mon/dossier" # chemin à changer bien sûr
# os.chdir(dossier_images)


## Fonctions utiles


def charge_image(name:str) -> list:
    """ conversion d'une image (niveaux de gris) en liste de valeurs """
    image = (mpimg.imread(name)).tolist()
    return image
    
    
def affiche_image(image:list) -> None:
    """ affiche une image associée à une liste"""
    plt.imshow(image, cmap='gray', clim=(0,255))
    plt.show()
    
def dim(img:list) -> tuple:
    ''' Renvoie le couple (largeur,hauteur) de l'image '''
    w = len(img[0])
    h = len(img)
    return (w, h)
    
def image_blanche(w:int,h:int) -> list:
    """ liste correspondant à une image blanche de dim (w,h)"""
    return [ [255]*w for k in range(h) ]
    # attention, l'écriture en compréhension est importante
        
    
# Un exemple basique

flamants = charge_image('flamantsNB.jpg')
print('(w, h) =', dim(flamants)) # affichage des dimensions de l'image
print("premier pixel (valeur entre 0 et 255): ",flamants[0][0]) # chaque case est un entier entre 0 et 255
affiche_image(flamants)

# Un exemple de fonction : négatif d'une image

def negatif(img:list) -> list:
    """modifie img en une liste correspondant au "négatif" de l'image """
    (w,h) = dim(img)
    img_new = image_blanche(w,h)
    
    for i in range(h):
        for j in range(w):
            val_pixel = img[i][j]
            img_new[i][j] = 255 - val_pixel
    return img_new

# A tester sur une des images données



## Réduction de moitié de la largeur (version naïve)

def reduction_moitie_ligne(l:list) -> list:
    pass

def reduction_moitie_image(img:list) -> list:
    pass

# FAIRE DES TESTS !!


## Calcul de l'énergie

def energie(img:list) -> list:
    '''Calcule l'énergie d'une image img'''
    pass
    
        
      
## Manipulations de listes

def enlever(l:list,i:int) -> list:
    pass
    
def indice_min(l:list) -> int:
    pass

## Réduction ligne par ligne
# À partir d'ici, il est demandé de compléter les signatures des fonctions

def reduction_ligne_par_ligne(img):
    pass
    
def itere_reduction_ligne_par_ligne(img, n):
    pass
    

## Réduction par colonne

def meilleure_colonne(e):
    pass
    
def reduction_meilleure_colonne(img):
    pass
    
def itere_reduction_meilleure_colonne(img, n):
    pass
    

## Seam carving

    
