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.
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.
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)
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.
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)
Copyright © 2010-2014, tous droits réservés, contact : operationpixel@free.fr