function J = filtre_gauss(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);

H = fspecial('gaussian'); %H = FSPECIAL('average',HSIZE) returns an averaging filter H of size HSIZE.
%HSIZE can be a vector specifying the number of rows and columns in H or a scalar, in which case H is a square matrix.
%The default HSIZE is [3 3].
%H is of class double.

%SOLUTION AVEC LA FONCTION DE MATLAB :
J2 = imfilter(I2,H); %B = IMFILTER(A,H,OPTION1,OPTION2,...), OPTION1 : When no boundary option is specified, IMFILTER uses X = 0
%The output array is the same size as the input array. This is the default behavior when no output
%size options are specified.

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

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électionne le premier cadran
colormap(gray)
imagesc(J2); %affichage du résultat
title(strcat(['PSNR = ', num2str(psnr(I,J2))])); % affichage du PSNR

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