l'image de fond

fr       en

Traitements d'Images Binaires

L'Etiquetage, Labellisation

Méthode

Ici, nous proposons une détection des objets d'une image. Nous allons détecter les objets blancs sur un fond noir d'une image binaire. L'inverse est tout à fait possible, il suffit d'inverser les valeurs des bits pour les conditions (0->1 et 1->0). Pour détecter ces objets, nous allons regarder trois pixels à la fois. Le pixel en cours , le pixel à sa gauche et le pixel du dessus. Nous parcourons l'image de gauche à droite et de haut en bas. Si vous ne parcourez pas l'image dans ce sens, il faudra choisir les voisins du pixel courant qui correspondent. Regardez l'image suivante, elle nous donne tous les cas qu'il nous est possible de rencontrer.
label1
Avec p(c) le pixel courant, p(g) le pixel de gauche et p(h) le pixel du dessus. Nous allons initialiser deux variables, une matrice de la même taille que l'image tout à zéro (region) et un scalaire à 1 (regionnombre)

Maintenant, nous avons une matrice contenant tous les objets que nous avons détectés. Or, nous avons vu que certaines régions sont les mêmes que d'autres. Nous les avons enregistrées dans correspondancetrouve. Il faut à présent faire correspondre les étiquettes. Pour faire ça, on part de la plus grande étiquette trouvée et nous allons descendre jusqu'à l'étiquette 1. Pour chaque étiquette, nous allons chercher dans le tableau de correspondance la plus petite étiquette qui va avec l'étiquette qui est traitée. Une fois trouvée, on remplace les étiquettes de la matrice r. C'est une opération longue car nous devons passer autant de fois qu'il existe d'étiquettes différentes.

Programme

clear all; close all;

[filename, pathname] = uigetfile({'*.jpg;*.tif;*.png;*.gif;*.bmp','All Image Files';...
          '*.*','All Files' },'mytitle',...
          'C:\Work\myfile.jpg')
x = imread(filename);
% image sur un plan
if (length(size(x))>2)
    x=mean(x,3);% passage de 3 dimensions à 1 ( couleur->niveau de gris)
end
% nombre de bit
k=8;
%taille de la matrice
[ligne colonne]=size(x);
% on inverse l'image les objets sont blanc
x=x/255;
for i = 1 : ligne
    for j = 1 : colonne
        x(i,j)=1-x(i,j);
    end
end
% on crée une matrice resultat de la même cast que l'image
r = ones(ligne,colonne);
regionnombre = 1;
correspondance = [0 0];
correspondancetrouve = 1;
%labellisation

% algorithme de l'inversion
for i=2:ligne
     for j=2:colonne
         if (x(i,j)==0)
             r(i,j)=0;
         elseif (x(i,j)==1)
             if (r(i-1,j)==0 && r(i,j-1)==0)
                 r(i,j)=regionnombre;
                 regionnombre = regionnombre +1;
             elseif (r(i-1,j)~=0 && r(i,j-1)==0)
                 r(i,j)=r(i-1,j);
             elseif (r(i-1,j)==0 && r(i,j-1)~=0)
                 r(i,j)=r(i,j-1);
             elseif (r(i-1,j)~=0 && r(i,j-1)~=0 && r(i-1,j)==r(i,j-1))
                 r(i,j)=r(i,j-1);
             elseif (r(i-1,j)~=0 && r(i,j-1)~=0 && r(i-1,j)~=r(i,j-1))
                 if r(i-1,j) < r(i,j-1)
                     r(i,j)=r(i-1,j);
                 else
                     r(i,j)=r(i,j-1);
                 end
                 correspondance(correspondancetrouve,:)= [r(i-1,j) r(i,j-1)];
                 correspondancetrouve = correspondancetrouve + 1;
             end
         end
         
     end
end
% mise a jour du resutlat selon les correspondances
for nb = regionnombre-1 : -1 : 1
    a=nb;
    for c = 1 : length(correspondance)
        if correspondance(c,1)==nb
            if correspondance(c,2)<a
                a=correspondance(c,2);
            end
        end
    end
    for c = 1 : length(correspondance)
        if correspondance(c,2)==nb
            if correspondance(c,1)<a
                a=correspondance(c,1);
            end
        end
    end
       
    for i=2:ligne
         for j=2:colonne
             if  r(i,j) == nb
                 r(i,j)= a;
             end
         end
    end
end
% les couleurs des objets sont réparties en niveau de gris de 50 à 205.
for i = 1: ligne
    for j = 1 : colonne
        if r(i,j)==0
        else
            r(i,j)=r(i,j)*200/max(max(r))+50;
        end
    end
end
r=uint8(r);%conversion en uint8 pour l'affichage.
 % on affiche le resultat
 figure(  'name','etiquetage',...
            'NumberTitle','off',...
            'color',[0.3137 0.3137 0.5098]);
 subplot(121)
 imshow(x*255)
 subplot(122)
 imshow(r)

Exemple


etiquetage labellisation d'une image
Un problème peut apparaitre, des petits objets sont détectés alors qu'ils ne sont que des parasites sur l'image. Une méthode pour les supprimer est de faire une 'érosion' ou une 'fermeture' ou une 'majorité' sur l'image binaire avant de faire l'étiquetage.
etiquetage labellisation d'une image

Suppression des Régions Mineures

Cette correction consiste à compter le nombre de pixels que contient un objet, si ce nombre est inférieur à un certain seuil (pour nous se sera 10 pixels) alors elle est considérée comme région mineure et nous la supprimons.

clear all; close all;

[filename, pathname] = uigetfile({'*.jpg;*.tif;*.png;*.gif;*.bmp','All Image Files';...
          '*.*','All Files' },'mytitle',...
          'C:\Work\myfile.jpg')
x = imread(filename);
% image sur un plan
if (length(size(x))>2)
    x=mean(x,3);% passage de 3 dimensions à 1 ( couleur->niveau de gris)
end
% nombre de bit
k=8;
%taille de la matrice
[ligne colonne]=size(x);
% on inverse l'image les objets sont blanc
x=x/255;
for i = 1 : ligne
    for j = 1 : colonne
        x(i,j)=1-x(i,j);
    end
end
% on crée une matrice resultat de la même cast que l'image
r = ones(ligne,colonne);
regionnombre = 1;
correspondance = [0 0];
correspondancetrouve = 1;
%labellisation

% algorithme de l'inversion
for i=2:ligne
     for j=2:colonne
         if (x(i,j)==0)
             r(i,j)=0;
         elseif (x(i,j)==1)
             if (r(i-1,j)==0 && r(i,j-1)==0)
                 r(i,j)=regionnombre;
                 regionnombre = regionnombre +1;
             elseif (r(i-1,j)~=0 && r(i,j-1)==0)
                 r(i,j)=r(i-1,j);
             elseif (r(i-1,j)==0 && r(i,j-1)~=0)
                 r(i,j)=r(i,j-1);
             elseif (r(i-1,j)~=0 && r(i,j-1)~=0 && r(i-1,j)==r(i,j-1))
                 r(i,j)=r(i,j-1);
             elseif (r(i-1,j)~=0 && r(i,j-1)~=0 && r(i-1,j)~=r(i,j-1))
                 if r(i-1,j) < r(i,j-1)
                     r(i,j)=r(i-1,j);
                 else
                     r(i,j)=r(i,j-1);
                 end
                 correspondance(correspondancetrouve,:)= [r(i-1,j) r(i,j-1)];
                 correspondancetrouve = correspondancetrouve + 1;
             end
         end
         
     end
end
% mise a jour du resutlat selon les correspondances
for nb = regionnombre-1 : -1 : 1
    a=nb;
    for c = 1 : length(correspondance)
        if correspondance(c,1)==nb
            if correspondance(c,2)<a
                a=correspondance(c,2);
            end
        end
    end
    for c = 1 : length(correspondance)
        if correspondance(c,2)==nb
            if correspondance(c,1)<a
                a=correspondance(c,1);
            end
        end
    end
       
    for i=2:ligne
         for j=2:colonne
             if  r(i,j) == nb
                 r(i,j)= a;
             end
         end
    end
end


% suppression des régions mineurs
rmineur=r;
regionmineur = [];
for nb = 1 : max(max(r))
    count = 0;
    for i = 1: ligne
        for j = 1 : colonne
            if rmineur(i,j)==nb
                count = count+1;
             end
        end
    end
    regionmineur(nb,:)=[nb count];
end
for nb = 1 : length(regionmineur)
    if regionmineur(nb,2)<10
        for i = 1: ligne
            for j = 1 : colonne
                 if rmineur(i,j)== regionmineur(nb,1)
                     rmineur(i,j)=0;
                 end
            end
        end
    end
end
% les couleurs des objets sont réparties en niveau de gris de 50 à 205.
for i = 1: ligne
    for j = 1 : colonne
        if r(i,j)==0
        else
            r(i,j)=r(i,j)*200/max(max(r))+50;
        end
    end
end
for i = 1: ligne
    for j = 1 : colonne
        if rmineur(i,j)==0
        else
            rmineur(i,j)=r(i,j)*200/max(max(rmineur))+50;
        end
    end
end
r=uint8(r);%conversion en uint8 pour l'affichage.
rmineur=uint8(rmineur);
 % on affiche le resultat
 figure(  'name','etiquetage',...
            'NumberTitle','off',...
            'color',[0.3137 0.3137 0.5098]);
 subplot(221)
 imshow(x*255)
 subplot(222)
 imshow(r)
  subplot(224)
 imshow(rmineur)


correction etiquetage labellisation d'une image

correction etiquetage labellisation d'une image

Copyright © 2010-2014, tous droits réservés, contact : operationpixel@free.fr