Catégories
Algorithme Matlab Projets traitement d'image Traitement du signal sur matlab

Seuillage d’une Image avec Matlab

Objectifs

  • Comprendre la notion du seuillage et son utilité
  • Savoir appliquer un seuil global à une image
  • Savoir appliquer un seuil local à une image
  • Etc.

Résultat seuillage image avec matlab

A quoi sert le seuillage ?

Le seuillage est une opération fondamentale  en traitement d’images avec Matlab. Elle consiste à transformer une image au NG (ou couleur) en une image binaire. L’opération du seuillage à pour objectifs de :

  • Réduire la taille de l’image: les pixels d’une image binaire ne peuvent prendre que deux valeurs (soit 0 ou 1). Le codage des pixels est « effectuer sur 1 bits contrairement aux images usuelles sur 8 bits. On constate un rapport 8 concernant l’allocation mémoire des deux images
  • Faciliter les traitements : il est beaucoup plus simple de traiter les images binaires contrairement aux images multi-niveaux (segmentation, labellisation, classification, etc.). Il permet de réduire l’espace des paramètres de l’image à  traiter

Technique 1

On verra dans ce tuto le seuillage d’une image couleur (ou NG). Le programme est compatible avec divers formats d’images. Dans le cas d’une image RGB, on va faire les traitements pour chaque composante (R, G et B). La première technique  consiste à utiliser deux boucle for et un seuil global/composante. Le choix du seuil est primordial durant l’opération du seuillage. Un mauvais choix peut entrainer par la suite des mauvais traitements de l’image.

On définit la valeur moyenne comme étant le seuil de chaque composante. Lorsque le pixel (i,j)>Seuil, alors on positionne à 1 le pixel (i,j) de l’image résultante, sinon à 0. On ferra l’opération pour chaque composante. Ci-dessous l’extrait du code de la technique.

im_2=0*im_1;
Seuil1=mean2(im_1(:,:,1));
Seuil2=mean2(im_1(:,:,2));
Seuil3=mean2(im_1(:,:,3));

for i=1:M
for j=1:N

% Composante R
if(im_1(i,j,1)>Seuil1)
im_2(i,j,1)=1;
end;

% Composante G
if(im_1(i,j,2)>Seuil2)
im_2(i,j,2)=1;
end;

% Composante B
if(im_1(i,j,3)>Seuil3)
im_2(i,j,3)=1;
end;
end;
end;

Technique 2

L’utilisation d’une double boucle for semble gourmande en temps du traitement. En particulier = lorsque la taille e l’image est importante.  Matlab met à disposition la fonction im2bw() dédiée au seuillage d’une image en une ligne de code ! On peut également utiliser  l’opérateur de comparaison « > ». Ci-dessous l’extrait du code Matlab.

% Par comparaison 
im_2(:,:,1)=im_1(:,:,1)> Seuil1;
im_2(:,:,2)=im_1(:,:,2)> Seuil2;
im_2(:,:,3)=im_1(:,:,3)> Seuil3;

% Ou bien
im_3=0*im_1;
im_3(:,:,1)=im2bw(im_1(:,:,1),Seuil1);
im_3(:,:,2)=im2bw(im_1(:,:,2),Seuil2);
im_3(:,:,3)=im2bw(im_1(:,:,3),Seuil3);

Technique 3

Le deux techniques semblent par très efficace, car elles font la comparions pixel par pixel sans tenir en c considération les pixels voisins. La technique 3 en revanche compare la valeurs du pixel (i,j) à la valeur moyenne des pixels voisins ! Le paramètre p dans le programme indique le nombre de pixels voisins (3×3 pour p=1, 5×5 pour p=2, etc.). Ci-dessous l’extrait du code Matlab.

Voir le tuto pour plus de détails

p=3; n=2*p+1; % 5x5: 

for i=p+1:M-p
for j=p+1:N-p

% Composante R
I0=im_1(i-p:i+p, j-p:j+p,1);
M=mean(I0(:));
if(M>Seuil1)
im_2(i,j,1)=1;
end;

% Composante G
I0=im_1(i-p:i+p, j-p:j+p,2);
M=mean(I0(:));
if(M>Seuil2)
im_2(i,j,2)=1;
end;

% Composante B
I0=im_1(i-p:i+p, j-p:j+p,3);
M=mean(I0(:));
if(M>Seuil3)
im_2(i,j,3)=1;
end;
end;
end;

La technique est robuste au bruit, car elle effectuer une moyenne locale des pixels de l’image avant l’opération du seuillage !

Code complet

clear all; close all; clc;




%% Traitement d'Images | Matlab #6: Seuillage - 3 Techniques
%% www.Electronique-Mixte.fr



% Comprendre la notion du seuillage et son utilité
% Savoir appliquer un seuil global à une image
% Savoir appliquer un seuil local à une image
% Etc.





%% Lecture de l'image

im_rgb= imread('coins.png');
% im_rgb= imread('bitcoin.jpg');
% im_rgb= imread('spine.tif');
% im_rgb= imread('mri.tif');

im_0=im2double(im_rgb);
[M,N,P]=size(im_0);
im_1=zeros(M,N,3);
for j=1:3
if P==3
im_1(:,:,j)=imadjust(im_0(:,:,j));
else
im_1(:,:,j)=imadjust(im_0);
end;
end;









%% Seuillage: Technique 1
im_2=0*im_1;
Seuil1=mean2(im_1(:,:,1));
Seuil2=mean2(im_1(:,:,2));
Seuil3=mean2(im_1(:,:,3));

% for i=1:M
% for j=1:N
%
% % Composante R
% if(im_1(i,j,1)>Seuil1)
% im_2(i,j,1)=1;
% end;
%
% % Composante G
% if(im_1(i,j,2)>Seuil2)
% im_2(i,j,2)=1;
% end;
%
% % Composante B
% if(im_1(i,j,3)>Seuil3)
% im_2(i,j,3)=1;
% end;
% end;
% end;


%% Seuillage: Technique 2

% Par comparaison
% im_2(:,:,1)=im_1(:,:,1)> Seuil1;
% im_2(:,:,2)=im_1(:,:,2)> Seuil2;
% im_2(:,:,3)=im_1(:,:,3)> Seuil3;

% Ou bien
im_3=0*im_1;
im_3(:,:,1)=im2bw(im_1(:,:,1),Seuil1);
im_3(:,:,2)=im2bw(im_1(:,:,2),Seuil2);
im_3(:,:,3)=im2bw(im_1(:,:,3),Seuil3);



%% Seuillage: Technique 3
p=3; n=2*p+1; % 5x5:

for i=p+1:M-p
for j=p+1:N-p

% Composante R
I0=im_1(i-p:i+p, j-p:j+p,1);
M=mean(I0(:));
if(M>Seuil1)
im_2(i,j,1)=1;
end;

% Composante G
I0=im_1(i-p:i+p, j-p:j+p,2);
M=mean(I0(:));
if(M>Seuil2)
im_2(i,j,2)=1;
end;

% Composante B
I0=im_1(i-p:i+p, j-p:j+p,3);
M=mean(I0(:));
if(M>Seuil3)
im_2(i,j,3)=1;
end;
end;
end;

%% Affichage

% figure(1);
% subplot(221); imshow(im_1);title('Image Originale','fontsize',16);
% subplot(222); imshow(im_2(:,:,1)); title('Composante R','fontsize',16);
% subplot(223); imshow(im_2(:,:,2)); title('Composante G','fontsize',16);
% subplot(224); imshow(im_2); title('Image RGB','fontsize',16);

figure(1);
subplot(131); imshow(im_1);title('Image Originale','fontsize',16);
subplot(132); imshow(im_3); title('Technique 2','fontsize',16);
subplot(133); imshow(im_2); title('Technique 3','fontsize',16);








imwrite(im_1,'im_1.png');
imwrite(im_2,'im_2.png');

Traitement d'Images | Matlab

Laisser un commentaire