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);