Objectifs
- Savoir Comment calculer le produit de convolution 2D
 - Connaitre le problème des bords
 - Savoir gérer les bords d’une image
 - Exemple: Filtre Moyenneur
 - Etc.
 
Calcul du produit de convolution (sans gestion des bords)
Voir le tuto pour plus de détails

clear all; close all; clc;
%% Lecture
im_rgb= imread('onion.png');
% im_rgb= imread('peppers.png');
im_1=im2double(im_rgb);
im_in_0=rgb2gray(im_1);
%% Produit de convolution 2D
% Masque / Filtre nxn
p=11; n=2*p+1; % 3x3
H=ones(n,n)/n^2;
%  Calcul du produit
im_in=im_in_0;
[M, N]=size(im_in);
im_out_1=0*im_in;
im_out_2=0*im_in;
im_out_3=0*im_in;
% Technique 1
for i=p+1:M-p
    for j=p+1:N-p
        im0=im_in(i-p:i+p, j-p:j+p); % nxn
        im1=im0.*H;
        %im_out_1(i,j)=sum(im1(:));
        % Ou bien
        im_out_1(i,j)=sum(sum(im1));
    end;
end;
% Technique 2
for i=1:M-n
    for j=1:N-n
        im0=im_in(i:i+n-1, j:j+n-1);
        im1=im0.*H;
        im_out_2(i,j)=sum(sum(im1));
    end;
end;
% Technique 3
for i=n+1:M
    for j=n+1:N
        im0=im_in(i-n+1:i, j-n+1:j);
        im1=im0.*H;
        im_out_3(i,j)=sum(sum(im1));
    end;
end;
%% Affichage
figure(1);
subplot(141); imshow(im_in_0);title('Originale');
subplot(142); imshow(im_out_1); title('Centré');
subplot(143); imshow(im_out_2); title('Avance');
subplot(144); imshow(im_out_3); title('Arrière'); Calcul du produit de convolution (avec gestion des bords)
Voir le tuto pour plus de détails

clear all; close all; clc;
%% Lecture
im_rgb= imread('onion.png');
% im_rgb= imread('peppers.png');
im_1=im2double(im_rgb);
im_in_0=rgb2gray(im_1);
%% Produit de convolution 2D
% Masque / Filtre
p=10; n=2*p+1;
%H=ones(n,n)/n^2;
H=randi(n,n);  H=H/sum(H(:));
%  Calcul du produit
im_in1=padarray(im_in_0,n);
im_in2=padarray(im_in1',n);
im_in3=im_in2';
[M, N]=size(im_in3);
im_out_1=im_in3;
im_out_2=im_in3;
im_out_3=im_in3;
% Technique 1
for i=p+1:M-p
    for j=p+1:N-p
        im0=im_in3(i-p:i+p, j-p:j+p);
        im1=im0.*H;
        %im_out_1(i,j)=sum(im1(:));
        % Ou bien
        im_out_1(i,j)=sum(sum(im1));
    end;
end;
% Technique 2
for i=1:M-n
    for j=1:N-n
        im0=im_in3(i:i+n-1, j:j+n-1);
        im1=im0.*H;
        im_out_2(i,j)=sum(sum(im1));
    end;
end;
% Technique 3
for i=n+1:M
    for j=n+1:N
        im0=im_in3(i-n+1:i, j-n+1:j);
        im1=im0.*H;
        im_out_3(i,j)=sum(sum(im1));
    end;
end;
im_out_1=im_out_1(n+1:end-n,n+1:end-n);
im_out_2=im_out_2(n+1:end-n,n+1:end-n);
im_out_3=im_out_3(n+1:end-n,n+1:end-n);
% Conv2D Matlab
im_out_4=conv2(im_in_0,H,'same'); % 'same', 'full',
%% Affichage
figure(1);
subplot(221); imshow(im_in_0);title('Originale');
subplot(222); imshow(im_out_1); title('Centré');
subplot(223); imshow(im_out_2); title('Avance');
subplot(224); imshow(im_out_3); title('Arrière');
figure(2);
subplot(121); imshow(im_out_1);title('Conv2 Centré');
subplot(122); imshow(im_out_4); title('Conv2 Matlab');
% Erreur entre les deux techniques
e=im_out_1-im_out_4; e=e(:);
figure(3); plot(e); 