"""
Programme   : TP-images-partie3-exo2.py
Langage     : Python 3
Modules     : Pillow
Auteur      : 
Description : mise en oeuvre du filtre de Sobel pour la détection de contours et du filtre réducteur de bruit
Pillow      : https://pillow.readthedocs.io/en/stable/

Exercice à réaliser :
	1) Ecrire une fonction qui applique le filtre de Sobel à une image.

	2) Ecrire une fonction qui applique le filtre de réduction de bruit à une image.
	Remarques : l'image originale n'étant pas bruitée, le résultat obtenu n'est guère convaincant
	et n'a pas grand intérêt puisqu'il dégrade l'image originale. Pour comprendre l'intérêt du filtre
	réducteur de bruit on peut :
		a) soit l'appliquer à une image bruitée comme par exemple une vieille photo numérisée ;
		b) soit introduire volontairement du bruit dans notre image originale en changeant de manière
		aléatoire la valeur de quelques pixels de l'image ;

	3) Ecrire une fonction qui introduit aléatoirement du bruit dans l'image originale sous forme
	de pixel dont le niveau de gris est lui-même aléatoire puis appliquer le filtre réducteur de bruit.
"""

# IMPORT =========================================================================================
from PIL import Image
import math, random

# FONCTIONS =======================================================================================
def voisinage(pimg, px, py):
	"""
	Description : 	construit la matrice carrée 3x3 au voisinage du pixel (px, py)
	Paramètres 	: 	type(pimg) => PIL.Image ; type(px, py) => (int, int)
	Retour 		: 	liste de listes 3x3
	"""
	pass

def convolution(K, V):
	"""
	Description : 	effectue le produit de convolution de K par V
	Paramètres 	: 	type(K, V) => liste de listes 3x3
	Retour 		: 	int
	"""
	pass

def sobel(Sx, Sy, pname):
	"""
	Description : 	applique le filtre de Sobel sur le fichier image pname
	Paramètres 	: 	type(Sx, Sy) => liste de listes 3x3 ; type(pname) => str
	Retour 		: 	Image.PIL ou None si le chargement a échoué
	"""
	pass

def reduire_bruit(pname):
	"""
	Description : 	applique le filtre de réduction de bruit par détermination de la médiane
	Paramètres 	: 	type(pname) => str
	Retour 		: 	Image.PIL ou None si le chargement a échoué
	"""
	pass

def introduire_bruit(pname):
	"""
	Description : 	introduit du bruit sous forme de pixel dont la valeur de gris est aléatoire
	Paramètres 	: 	type(pname) => str
	Retour 		: 	Image.PIL ou None si le chargement a échoué
	"""
	pass

# PROGRAMME PRINCIPAL =============================================================================
# Question 1
# Noyau de convolution pour le calcul du gradient horizontal
Sx = 	[[-1, -2, -1],
		 [ 0,  0,  0],
		 [ 1,  2,  1]]
# Noyau de convolution pour le calcul du gradient vertical
Sy = 	[[-1, 0, 1],
		 [-2, 0, 2],
		 [-1, 0, 1]]
img = sobel(Sx, Sy, "gris-paf.png")
if img == None:
	print("Echec dans l'application du filtre")
else:
	img.show()

# Question 2
img = introduire_bruit("gris-paf.png")
if img == None:
	print("Echec dans l'application du filtre")
else:
	img.show()

img = reduire_bruit("gris-paf.png")
if img == None:
	print("Echec dans l'application du filtre")
else:
	img.show()
