l'image de fond

fr       en

Traitements d'Images Binaires

Moments des Régions

Moments

Le moment d'une région se calcule grâce à l'équation suivante :
m p q = x = 0 M y = 0 N I ( x , y ) x p y q

Aire des régions

L'aire d'une région peut se calculer avec le moment d'ordre p=0 et q=0:
A ( R ) = x = 0 M y + 0 N I ( x , y ) x 0 y 0 = m 00 ( R )
Où A(R) est l'aire de la région.
voici le programme:

clear all;
close all;

%x = imread('objetinv.PNG');
x = imread('objetinv2.PNG');
%x = imread('forme.PNG');
x=x(:,:,1);
[M N] = size(x);
%binarisation
level = graythresh(x);
img = im2bw(x,0.1);
%labellisation
CC = bwconncomp(img);
L = labelmatrix(CC);

%affihcage
figure
subplot(221)
imshow(img)
subplot(222)
imshow(label2rgb(L));

%nombre d'objet, number of objects
nbobj = max(max(L));

%parametres des objets, object's parameters
param=zeros(nbobj,6);
for i = 1 : nbobj
   param(i,1)=i;
end
%param = [ numero , nb pixel , boite_gauche , boite_droite , boite_haut ,
%boite_bas]

for i = 1 : M
    for j = 1 : N
        if L(i,j)~=0
            numero = L(i,j);
            param(numero,2)= param(numero,2) + 1 ;
            if param(numero,3)==0 || param(numero,3)>j
                param(numero,3)=j;
            end
            if param(numero,4)==0 || param(numero,4)<j
                param(numero,4)=j;
            end
            if param(numero,5)==0 || param(numero,5)>i
                param(numero,5)=i;
            end
            if param(numero,6)==0 || param(numero,6)<i
                param(numero,6)=i;
            end
        end
    end
end

% supression petit objet
var =1;
for i = 1 : nbobj
    if param(i,2)>10
        parametre(var,:)=param(i,:);
        var=var+1;
    end
end
nbobj = size(parametre,1);
 
%###########
%###########
%%%%%%moment
moment_0_0=zeros(nbobj,1);
p=0;
q=0;
for i = 1 : nbobj
    boite = L(parametre(i,5):parametre(i,6),parametre(i,3):parametre(i,4));
    label = parametre(i,1);
    for m = 1 : size(boite,1)
        for n = 1 : size(boite,2)
            if boite(m,n)==label
                moment_0_0(i,1)=moment_0_0(i,1)+ (m^p*n^q);
            end
        end
           
    end
end
% affichage centre de gravité
%subplot(223)
figure('color',[0.3137 0.3137 0.5098])
imshow(img)
hold on
for i = 1 : nbobj
    subplot(3,4,i)
    imshow(img(parametre(i,5):parametre(i,6),parametre(i,3):parametre(i,4)))
    title(strcat('A(R)=',num2str(moment_0_0(i))))
end

Un exemple


momentaire

Centre de Gravité

Le centre de gravité est calculé avec les moments d'ordre p=1 et q=0 pour la coordonnée en x et p=0 et q=1 pour y. Les moments trouvés sont ensuite normalisés par le moment d'ordre 0 de la région (A(R)). On a :
x c e n t r e = 1 A ( R ) x = 0 M y + 0 N I ( x , y ) x 1 y 0 = m 10 ( R ) m 00 ( R )
y c e n t r e = 1 A ( R ) x = 0 M y + 0 N I ( x , y ) x 0 y 1 = m 01 ( R ) m 00 ( R )
voici le programme :

%centroide
moment_1_0=zeros(nbobj,1);
p=1;
q=0;
for i = 1 : nbobj
    boite = L(parametre(i,5):parametre(i,6),parametre(i,3):parametre(i,4));
    label = parametre(i,1);
    for m = 1 : size(boite,1)
        for n = 1 : size(boite,2)
            if boite(m,n)==label
                moment_1_0(i,1)=moment_1_0(i,1)+ (m^p*n^q);
            end
        end
           
    end
end
moment_1_0=round(moment_1_0./moment_0_0);
moment_1_0= moment_1_0+parametre(:,5);
%
moment_0_1=zeros(nbobj,1);
p=0;
q=1;
for i = 1 : nbobj
    boite = L(parametre(i,5):parametre(i,6),parametre(i,3):parametre(i,4));
    label = parametre(i,1);
    for m = 1 : size(boite,1)
        for n = 1 : size(boite,2)
            if boite(m,n)==label
                moment_0_1(i,1)=moment_0_1(i,1)+ (m^p*n^q);
            end
        end
           
    end
 
end
moment_0_1=round(moment_0_1./moment_0_0);
moment_0_1= moment_0_1+parametre(:,3);

% affichage centre de gravité
%subplot(223)
figure('color',[0.3137 0.3137 0.5098])
imshow(img)
hold on
for i = 1 : nbobj
    plot(moment_0_1(i),moment_1_0(i),'r+','LineWidth',2)
end
title('center of gravity')

Un exemple


momentcentroid

Moments Centraux

Ils sont calculés pour les coordonnées prises par rapport aux coordonnées du centre de gravité :
μ p q = x = 0 M y + 0 N I ( x , y ) ( x - x c e n t r e ) p ( y - y c e n t r e ) q

Moments Centraux Normalisés

Pour normaliser un moment, on le multiplie par l'inverse du moment d'ordre 0 (l'aire) élevé à la puissance (p+q+2)/2. On trouve :
μ p q ( R ) = μ p q ( 1 μ 00 ( R ) ) ( p + q + 2 2 )

Orientation des régions

L'orientation d'une région nous donne l'axe passant par son centroïde et traversant la plus grande partie de la région. L'angle θ représente l'angle de rotation de l'axe par rapport à l'horizontal. On a :
θ ( R ) = 1 2 t a n - 1 ( 2 μ 11 ( R ) μ 20 ( R ) - μ 02 ( R ) )
Grâce à cet angle, nous pouvons tracer le segment de droite passant par le centroïde de la région. Le facteur λ permet de définir la longueur du segment de droite.
( x ' y ' ) = ( x c e n t r e y c e n t r e ) + λ ( cos( θ ( R ) ) sin( θ ( R ) ) )
voici le programme :

% orientation
theta=zeros(nbobj,1);
moment_0_0=zeros(nbobj,1);
moment_1_0=zeros(nbobj,1);
moment_0_1=zeros(nbobj,1);
moment_1_1=zeros(nbobj,1);
moment_2_0=zeros(nbobj,1);
moment_0_2=zeros(nbobj,1);
for i = 1 : nbobj
    boite = L(parametre(i,5):parametre(i,6)+1,parametre(i,3):parametre(i,4)+1);
    label = parametre(i,1);
   
    for m = 1 : size(boite,1)
        for n = 1 : size(boite,2)
           
            if boite(m,n)==label
                p=0;
                q=0;
                moment_0_0(i,1)=moment_0_0(i,1)+ (m^p)*(n^q);
                p=1;
                q=0;
                moment_1_0(i,1)=moment_1_0(i,1)+ (m^p)*(n^q);
                p=0;
                q=1;
                moment_0_1(i,1)=moment_0_1(i,1)+ (m^p)*(n^q);
            end
        end  
    end
       
    moment_1_0(i,1)=moment_1_0(i,1)/moment_0_0(i,1);
    moment_0_1(i,1)=moment_0_1(i,1)/moment_0_0(i,1);
   
    for m = 1 : size(boite,1)
        for n = 1 : size(boite,2)
           
            if boite(m,n)==label
                p=1;
                q=1;
                moment_1_1(i,1)=moment_1_1(i,1)+ ((m-moment_1_0(i,1))^p)*((n-moment_0_1(i,1))^q);
                p=2;
                q=0;
                moment_2_0(i,1)=moment_2_0(i,1)+ ((m-moment_1_0(i,1))^p)*((n-moment_0_1(i,1))^q);
                p=0;
                q=2;
                moment_0_2(i,1)=moment_0_2(i,1)+ ((m-moment_1_0(i,1))^p)*((n-moment_0_1(i,1))^q);
            end
        end  
    end
    moment_1_1(i,1)=moment_1_1(i,1)*(1/moment_0_0(i,1))^2;
   
    moment_2_0(i,1)=moment_2_0(i,1)*(1/moment_0_0(i,1))^2;
   
    moment_0_2(i,1)=moment_0_2(i,1)*(1/moment_0_0(i,1))^2;

   
   
    a=2*moment_1_1(i,1);
    b=moment_2_0(i,1)-moment_0_2(i,1);
    theta(i)= atan(a/b)/2;
    if moment_2_0(i,1)<moment_0_2(i,1)
         theta(i)=theta(i)+pi/2;
    end
   
end

% affichage orientation des momentsd
%subplot(223)
figure('color',[0.3137 0.3137 0.5098])
a=axes
x=0;
y=0;
lambda=50;
imshow(img)
hold on
for i = 1 : nbobj
   
    x(1)=moment_1_0(i)+parametre(i,5);
    x(2)=(x(1) + cos(theta(i))*lambda);
    y(1)=moment_0_1(i)+parametre(i,3);
    y(2)=(y(1) + sin(theta(i))*lambda);
    x=round(x);
    y=round(y);
    plot(y(1),x(1),'r+','LineWidth',2)
    plot([y(1) y(2)],[x(1) x(2)] ,'r')
end
title('moment orientation')
 

Un exemple


momentorientation

Excentricité des régions

E c c ( R ) = μ 20 + μ 02 + ( μ 20 - μ 02 ) 2 + 4 μ 11 2 μ 20 + μ 02 - ( μ 20 - μ 02 ) 2 + 4 μ 11 2 = a 1 a 2 ,
r a = ( 2 a 1 A ( R ) ) 1 2
r b = ( 2 a 2 A ( R ) ) 1 2
Où ra et rb sont les paramètres de l'ellipse de la région. Nous pouvons tracer l'ellipse grâce aux équations d'une ellipse :
( x ( t ) y ( t ) ) = ( x c e n t r e y c e n t r e ) + ( cos ( θ ) - sin ( θ ) sin ( θ ) cos ( θ ) ) ( r a cos ( t ) r b sin ( t ) )
ou 0 t 2 π
voici le programme :

% excentricité
for i = 1 : nbobj
    a1(i)=moment_2_0(i)+moment_0_2(i)+sqrt( (moment_2_0(i)-moment_0_2(i))^2 + 4*moment_1_1(i)^2);
    a2(i)=moment_2_0(i)+moment_0_2(i)-sqrt( (moment_2_0(i)-moment_0_2(i))^2 + 4*moment_1_1(i)^2);
    ra(i)=(2*a1(i)/moment_0_0(i))^0.5;
    rb(i)=(2*a2(i)/moment_0_0(i))^0.5;
end
 
figure('color',[0.3137 0.3137 0.5098])
a=axes
x=0;
y=0;
imshow(img)
hold on
for i = 1 : nbobj
    a(1)=moment_1_0(i)+parametre(i,5);  
    b(1)=moment_0_1(i)+parametre(i,3);
    a=round(a);
    b=round(b);
    ra(i)=ra(i)*moment_0_0(i);
    rb(i)=rb(i)*moment_0_0(i);
    t=0:1/1000:2*pi;
    for j = 1 : length(t)
        [x(1:2,j)]= [a;b]+[cos(theta(i)) -sin(theta(i));sin(theta(i)) cos(theta(i))]*[ra(i)*cos(t(j));rb(i)*sin(t(j))];
    end
    plot(b,a,'r+','LineWidth',2)
    plot(x(2,:),x(1,:) ,'r')
end
title('moment orientation')

 

Un exemple


momentexc

Programme complet

clear all;
close all;
x = imread('objetinv2.PNG');
x=x(:,:,1);
[M N] = size(x);
%binarisation
level = graythresh(x);
img = im2bw(x,0.1);
%labellisation
CC = bwconncomp(img);
L = labelmatrix(CC);

%affihcage
figure
subplot(221)
imshow(img)
subplot(222)
imshow(label2rgb(L));

%nombre d'objet, number of objects
nbobj = max(max(L));

%parametres des objets, object's parameters
param=zeros(nbobj,6);
for i = 1 : nbobj
   param(i,1)=i;
end
%param = [ numero , nb pixel , boite_gauche , boite_droite , boite_haut ,
%boite_bas]

for i = 1 : M
    for j = 1 : N
        if L(i,j)~=0
            numero = L(i,j);
            param(numero,2)= param(numero,2) + 1 ;
            if param(numero,3)==0 || param(numero,3)>j
                param(numero,3)=j;
            end
            if param(numero,4)==0 || param(numero,4)<j
                param(numero,4)=j;
            end
            if param(numero,5)==0 || param(numero,5)>i
                param(numero,5)=i;
            end
            if param(numero,6)==0 || param(numero,6)<i
                param(numero,6)=i;
            end
        end
    end
end

% supression petit objet
var =1;
for i = 1 : nbobj
    if param(i,2)>10
        parametre(var,:)=param(i,:);
        var=var+1;
    end
end
nbobj = size(parametre,1);
 
%%%%%%moment
moment_0_0=zeros(nbobj,1);
p=0;
q=0;
for i = 1 : nbobj
    boite = L(parametre(i,5):parametre(i,6),parametre(i,3):parametre(i,4));
    label = parametre(i,1);
    for m = 1 : size(boite,1)
        for n = 1 : size(boite,2)
            if boite(m,n)==label
                moment_0_0(i,1)=moment_0_0(i,1)+ (m^p*n^q);
            end
        end
           
    end
end
% affichage centre de gravité
%subplot(223)
figure('color',[0.3137 0.3137 0.5098])
imshow(img)
hold on
for i = 1 : nbobj
    subplot(3,4,i)
    imshow(img(parametre(i,5):parametre(i,6),parametre(i,3):parametre(i,4)))
    title(strcat('A(R)=',num2str(moment_0_0(i))))
end


%centroide
moment_1_0=zeros(nbobj,1);
p=1;
q=0;
for i = 1 : nbobj
    boite = L(parametre(i,5):parametre(i,6),parametre(i,3):parametre(i,4));
    label = parametre(i,1);
    for m = 1 : size(boite,1)
        for n = 1 : size(boite,2)
            if boite(m,n)==label
                moment_1_0(i,1)=moment_1_0(i,1)+ (m^p*n^q);
            end
        end
           
    end
end
moment_1_0=round(moment_1_0./moment_0_0);
moment_1_0= moment_1_0+parametre(:,5);
%
moment_0_1=zeros(nbobj,1);
p=0;
q=1;
for i = 1 : nbobj
    boite = L(parametre(i,5):parametre(i,6),parametre(i,3):parametre(i,4));
    label = parametre(i,1);
    for m = 1 : size(boite,1)
        for n = 1 : size(boite,2)
            if boite(m,n)==label
                moment_0_1(i,1)=moment_0_1(i,1)+ (m^p*n^q);
            end
        end
           
    end
 
end
moment_0_1=round(moment_0_1./moment_0_0);
moment_0_1= moment_0_1+parametre(:,3);

% affichage centre de gravité
%subplot(223)
figure('color',[0.3137 0.3137 0.5098])
imshow(img)
hold on
for i = 1 : nbobj
    plot(moment_0_1(i),moment_1_0(i),'r+','LineWidth',2)
end
title('center of gravity')
 

% orientation
theta=zeros(nbobj,1);
moment_0_0=zeros(nbobj,1);
moment_1_0=zeros(nbobj,1);
moment_0_1=zeros(nbobj,1);
moment_1_1=zeros(nbobj,1);
moment_2_0=zeros(nbobj,1);
moment_0_2=zeros(nbobj,1);
for i = 1 : nbobj
    boite = L(parametre(i,5):parametre(i,6)+1,parametre(i,3):parametre(i,4)+1);
    label = parametre(i,1);
   
    for m = 1 : size(boite,1)
        for n = 1 : size(boite,2)
           
            if boite(m,n)==label
                p=0;
                q=0;
                moment_0_0(i,1)=moment_0_0(i,1)+ (m^p)*(n^q);
                p=1;
                q=0;
                moment_1_0(i,1)=moment_1_0(i,1)+ (m^p)*(n^q);
                p=0;
                q=1;
                moment_0_1(i,1)=moment_0_1(i,1)+ (m^p)*(n^q);
            end
        end  
    end
       
    moment_1_0(i,1)=moment_1_0(i,1)/moment_0_0(i,1);
    moment_0_1(i,1)=moment_0_1(i,1)/moment_0_0(i,1);
   
    for m = 1 : size(boite,1)
        for n = 1 : size(boite,2)
           
            if boite(m,n)==label
                p=1;
                q=1;
                moment_1_1(i,1)=moment_1_1(i,1)+ ((m-moment_1_0(i,1))^p)*((n-moment_0_1(i,1))^q);
                p=2;
                q=0;
                moment_2_0(i,1)=moment_2_0(i,1)+ ((m-moment_1_0(i,1))^p)*((n-moment_0_1(i,1))^q);
                p=0;
                q=2;
                moment_0_2(i,1)=moment_0_2(i,1)+ ((m-moment_1_0(i,1))^p)*((n-moment_0_1(i,1))^q);
            end
        end  
    end
    moment_1_1(i,1)=moment_1_1(i,1)*(1/moment_0_0(i,1))^2;
   
    moment_2_0(i,1)=moment_2_0(i,1)*(1/moment_0_0(i,1))^2;
   
    moment_0_2(i,1)=moment_0_2(i,1)*(1/moment_0_0(i,1))^2;

   
   
    a=2*moment_1_1(i,1);
    b=moment_2_0(i,1)-moment_0_2(i,1);
    theta(i)= atan(a/b)/2;
    if moment_2_0(i,1)<moment_0_2(i,1)
         theta(i)=theta(i)+pi/2;
    end
   
end

% affichage orientation des momentsd
%subplot(223)
figure('color',[0.3137 0.3137 0.5098])
a=axes
x=0;
y=0;
lambda=50;
imshow(img)
hold on
for i = 1 : nbobj
   
    x(1)=moment_1_0(i)+parametre(i,5);
    x(2)=(x(1) + cos(theta(i))*lambda);
    y(1)=moment_0_1(i)+parametre(i,3);
    y(2)=(y(1) + sin(theta(i))*lambda);
    x=round(x);
    y=round(y);
    plot(y(1),x(1),'r+','LineWidth',2)
    plot([y(1) y(2)],[x(1) x(2)] ,'r')
end
title('moment orientation')

% excentricité
for i = 1 : nbobj
    a1(i)=moment_2_0(i)+moment_0_2(i)+sqrt( (moment_2_0(i)-moment_0_2(i))^2 + 4*moment_1_1(i)^2);
    a2(i)=moment_2_0(i)+moment_0_2(i)-sqrt( (moment_2_0(i)-moment_0_2(i))^2 + 4*moment_1_1(i)^2);
    ra(i)=(2*a1(i)/moment_0_0(i))^0.5;
    rb(i)=(2*a2(i)/moment_0_0(i))^0.5;
end
 
figure('color',[0.3137 0.3137 0.5098])
x=0;
y=0;
imshow(img)
hold on
for i = 1 : nbobj
    a(1)=moment_1_0(i)+parametre(i,5);  
    b(1)=moment_0_1(i)+parametre(i,3);
    a=round(a);
    b=round(b);
    ra(i)=ra(i)*moment_0_0(i);
    rb(i)=rb(i)*moment_0_0(i);
    t=0:1/1000:2*pi;
    for j = 1 : length(t)
        [x(1:2,j)]= [a;b]+[cos(theta(i)) -sin(theta(i));sin(theta(i)) cos(theta(i))]*[ra(i)*cos(t(j));rb(i)*sin(t(j))];
    end
    plot(b,a,'r+','LineWidth',2)
    plot(x(2,:),x(1,:) ,'r')
end
title('moment orientation')

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