function J = filtre_median (I)  %fonction qui prend en paramètre une image I et retourne une image J filtrée
	[m, n, can] = size(I); %m=nb lignes, n=nb colonnes, can=nb canaux
	res = zeros (m, n);    %image résultante (de même taille que I) : initialisée à 0 partout
	if(can > 1)
	    I = rgb2gray(I);  %dans le cas d'une image couleur, la transformer en NG
	end

	%I2=imnoise(I,'gaussian',0, 0.05);
	I2=imnoise(I,'salt & pepper',0.4);

	%SOLUTION EN ENLEVANT LES LIGNES ET COLONNES DE DEBUT ET FIN :
	% J=I;
	% for l = 2:1:m-1;       %on enlève 1 ligne au début et à la fin
	%     for c = 2:1:n-1;   %on enlève 1 colonne au début et à la fin
	%     %récupération des pixels voulus
	%     filtre = I2(l-1:l+1, c-1:c+1);
	%     %transformation de la matrice en vecteur
	%     vecteurfiltre = reshape(filtre,1,9);  
	%     %tri du vecteur
	%     filtretrie = sort(vecteurfiltre);
	%     %on remplace le pixel de l'image par la valeur médiane
	%     J(l,c) = filtretrie(5);
	%     end;
	% end;

	%SOLUTION EN AJOUTANT DES 0 AUTOUR :
	I3=uint8(zeros(m+2,n+2));
	for l = 2:m+1;       
	     for c = 2:n+1;
		 I3(l,c) = I2(l-1,c-1);
	     end;
	end;

	for l = 2:1:m+1;       
	    for c = 2:1:n+1;   
	    %récupération des pixels voulus
	    filtre = I3(l-1:l+1, c-1:c+1);
	    %transformation de la matrice en vecteur
	    %vecteurfiltre = reshape(filtre,1,9);   %1 ligne et 9 colonnes ou :
	    vecteurfiltre = filtre(:);    %applati une matrice en vecteur colonne
	    %tri du vecteur
	    filtretrie = sort(vecteurfiltre);  %For vectors, SORT(X) sorts the elements of X in ascending order.
	    %on remplace le pixel de l'image par la valeur médiane
	    J(l-1,c-1) = filtretrie(5);  %5ème entrée du vecteur
	    end;
	end;

	%SOLUTION AVEC LA FONCTION DE MATLAB :
	J4= medfilt2(I2);    %B = MEDFILT2(A,[M N]) performs median filtering of the matrix A in two dimensions. Each output pixel contains the median
			    %value in the M-by-N neighborhood around the corresponding pixel in the input image. 
			    %MEDFILT2 pads the image with zeros on the edges, so the median values for the points within [M N]/2 of the edges may appear distorted.
	 
			    %B = MEDFILT2(A) performs median filtering of the matrix A using the default 3-by-3 neighborhood.

	%SOLUTION EN APPLIQUANT PLUSIEURS FOIS LE FILTRAGE :
	%J3= medfilt2(J2);
	%J4= medfilt2(J3);

	figure
	%divise la fenêtre en 1 ligne et 2 colonnes : pour afficher 2 images l'une à côté de l'autre
	subplot(1, 2, 1)  %sélactionne le premier cadran 
	colormap(gray)
	imagesc(J);       %affichage de l'image originale
	title(strcat(['PSNR = ', num2str(psnr(I,J))]));  % affichage du PSNR

	subplot(1, 2, 2) %sélactionne le deuxième cadran
	colormap(gray)
	imagesc(J4);    %affichage du résultat
	title(strcat(['PSNR = ', num2str(psnr(I,J4))]));  % affichage du PSNR
