Bibm@th

Forum de mathématiques - Bibm@th.net

Bienvenue dans les forums du site BibM@th, des forums où on dit Bonjour (Bonsoir), Merci, S'il vous plaît...

Vous n'êtes pas identifié(e).

#2 Programmation » Post traitement d'une image » 31-05-2012 14:05:17

stormin
Réponses : 2

Bonsoir à tous,


Dans le contexte de traitement d'images,je voudrais savoir comment découper une zone de l'image(comme illustré dans la pièce jointe)?

J'ai besoin de prendre une partie de l'image dépourvue de noir,d'une manière automatique.
120531034056674890.png]

Merci d'avance

#3 Re : Programmation » Corrélation par SAD( somme des différences absolues) » 28-03-2012 11:47:57

Salut,

Bon, alors pour moi la différence de deux points, ça n'existe pas, fussent-ils des points d'une image... I1 et I2 ne sont peut-être pas des points ?]

I1 et I2 : sont des intensités (niveau de gris)  dans l'image 1 et 2.



Ce sont peut-être des images ? (la différence des valeurs absolues de deux images, ça n'existe pas non plus !) Et (i ; j) les coordonnées d'un point quelconque d'une image.]

La différence des valeurs absolues des intensités des deux images.
(i ; j) les coordonnées d'un point(pixel) quelconque d'une image.


Quel est le principe de ce que tu veux faire ?]

C'est le principe de la vision stéréoscopique:à partir de 2 images prises de deux points de vues légèrement différents,on essaie de la correspondance (degré de ressemblance qui donne la carte de disparité) entre les deux images.


Je suppose que tu disposes de deux images A et B.]

Oui ,exactement.


Cherches-tu à "comparer" chaque point de l'une avec chaque point de l'autre ?]

Oui,mais précisément l'intensité de point.

Sûrement ! nomadstorm et stormin ont storm en commun... L'intro est la même...]

C'est moi,j'ai pas trouvé la bonne réponse,je sais pas comment programmer la formule SAD pour trouver la disparité.

Merci

#4 Programmation » Corrélation par SAD( somme des différences absolues) » 28-03-2012 10:22:00

stormin
Réponses : 5

Bonsoir tout le monde,

J'ai 2 images dont je veux chercher la correspondance par corrélation afin de trouver la carte de disparité, en utilisant la somme des différences absolues (SAD).

SAD= 1/(m+n) ∑(i=1 to m) ∑(j=1 to n) |I1 (i,j) - I2 (i,j)|

Si vous avez des propositions pour la programmer,je serai très reconnaissant.


Merci d'avance

#5 Entraide (supérieur) » Comprendre une formule » 25-10-2011 16:57:40

stormin
Réponses : 4

Bonsoir tout le monde,

Pouvez vous m'aider à comprendre la formule: [tex]C(0,0)=max(C(x,y))=\iint C(u,v)\, e^{i(xu+yv)} du\; dv[/tex]

Et pourquoi dans l'exponentielle,il y a pas 2*pi .

Merci

#6 Re : Programmation » Vérifier continuellement une condition » 29-06-2011 17:53:11

Bonsoir,

Yoshi,j'ai besoin de votre aide à trouver un livre (de Jean-Louis Tribillon dont le titre est:Traitement optique de l'information et reconnaissance des formes par voie optique) sous format pdf ou word ,pour bien comprendre mes programmes.

Merci

#7 Re : Programmation » Vérifier continuellement une condition » 16-06-2011 13:22:02

Re,
Merci pour la réponse,maintenant il fonctionne correctement,et je pouvais sortir de la boucle,mais juste après la boucle,il faut que je calcule une capacité de discrimination:

MASQUE=MASQUE1.*MASQUE2;

    Q=fftshift(ifft2(CC.*MASQUE));
    G=abs(Q).^2;

    cont=contpos+contneg


    Q1=fftshift(ifft2(AAuto_Cor.*MASQUE));
    G1=abs(Q1).^2;

    Q2=fftshift(ifft2(X_XCor1.*MASQUE));
    G2=abs(Q2).^2;

    Q3=fftshift(ifft2(X_XCor2.*MASQUE));
    G3=abs(Q3).^2;

    [M11 idx1] = max(G1(:));
    [M12 idx2] = max(G2(:));
    [M13 idx3] = max(G3(:));

    DC1=M12/M11
    DC2=M13/M11

En variant epse de 0 à 1,je dois trouver par exemple pour epse=1,une des deux DC qui est égale à 1,mais avec ce programme,j'ai trouvé 0.2.

Je pense que ce problème est du à l'utilisation de abs(somme1)<abs(somme2) au lieu de somme1<somme2,et avec cette dernière condition sans abs,je reviens au problème de somme1=0.

Merci

#8 Re : Programmation » Vérifier continuellement une condition » 15-06-2011 12:34:34

Quel est l'objectif de ton travail ?

L'objectif de mon programme est de construire un masque binaire et cela à travers des mises de zéros si et seulement si somme1(2) est strictement supérieure ou inférieure à zéro.

Quelque chose comme ça peut-être :
if(somme1==0)
break;
end

Oui,j'ai déjà essayé cette solution,je me trouve toujours devant le même problème.

    somme2 = sum(Matrice2(:))
end
if(somme1==0),break,end
end

#9 Re : Programmation » Vérifier continuellement une condition » 15-06-2011 10:25:34

Re,

Quel est le langage de programmation ?

Matlab


Lorsque ça bloque sur somme1=0, quelle est la valeur de somme2 ?

J'ai pas la possibilité de savoir puisque le programme se bloque.

As-tu essayé de mettre une inégalité large et une inégalité stricte au lieu de 2 inégalités strictes ?

Je suis obligé suivant l'objectif de mon travail d'utiliser des inégalités strictes.

#10 Programmation » Vérifier continuellement une condition » 14-06-2011 20:46:12

stormin
Réponses : 8

Bonsoir,

Le principe de mon programme est de travailler avec la matrice dont sa somme est supérieure et  de vérifier après chaque mise de zéro dans Matrice1 ou bien Matrice2,si la condition est encore présente,sinon je passe à l'autre Matrice.

Le problème est que dans l’exécution, il reste figé sur somme1=0.
Pourquoi et comment je sors de la boucle?


epse=0.0075 ;
epsilon=0.01;
contpos=0;
contneg=0;
MASQUE1=ones(256,256);
MASQUE2=ones(256,256);

Matrice1=abs(TF4).*cos(angle(TF4) - angle(TF1))-epse*abs(TF1);
Matrice2=abs(TF5).*cos(angle(TF5) - angle(TF1))-epse*abs(TF1);

somme1 = sum(Matrice1(:));
somme2 = sum(Matrice2(:));

while abs(somme2-somme1)>epsilon  
   
   while   somme1>somme2
   

      if(somme1>0)

        [maximum1 indice1] = max(Matrice1(:));
        Matrice1(indice1) = 0;
        MASQUE1(indice1) = 0;
        contpos=contpos+1;

      end
     

     if(somme1<0)

        [minimum1 indice1] = min(Matrice1(:));
        Matrice1(indice1) = 0;
        MASQUE1(indice1) = 0;
        contneg=contneg+1;


     end
     
       somme1 = sum(Matrice1(:))
   end  

while somme1<somme2
   

    if(somme2>0)

        [maximum2 indice2] = max(Matrice2(:));
        Matrice2(indice2) = 0;
        MASQUE2(indice2) = 0;
        contpos=contpos+1;

    end
 
 
   if(somme2<0)

        [minimum2 indice2] = min(Matrice2(:));
        Matrice2(indice2) = 0;
        MASQUE2(indice2) = 0;
        contneg=contneg+1;

   end
    somme2 = sum(Matrice2(:))
end

end

Merci

#11 Re : Programmation » Matlab: Centrer une lettre » 27-05-2011 11:30:47

Re,

Merci,je vais essayer de ce concentrer sur le programme.

#12 Re : Programmation » Matlab: test répétitif dans while » 26-05-2011 21:56:21

Re,

Mon objectif est de rassembler tous les MASQUES,en enregistrant à chaque fois le dernier MASQUE.

else      
        Test=Test.*MASQUE;
        MASQUE=ones(256,256);
        compteur=compteur+1; %% Inisialisé à zéro
    end

Merci

#13 Re : Programmation » Matlab: test répétitif dans while » 26-05-2011 14:21:39

Re,

1. Quel est l'intérêt de remplir la matrice Test avec des 1, puis de multiplier Test par la matrice Masque pour en conserver l'ancienne valeur.

Test est dans une boucle,donc je garde chaque fois le dernier MASQUE dans Test:
Par exemple,je procède de la manière suivante:

Test= 1 1 1
         1 1 1
         1 1 1
MASQUE= 0 1 1
               1 0 0
               1 1 1

Test=       0 1 1
               1 0 0
               1 1 1
MASQUE=  1 1 0
                1 1 1
                1 1 1
Test=       0 1 0
               1 0 0
               1 1 1

Avec :

Test=MASQUE;

Je peux pas trouver mon Test ,dont il cumule les MASQUES.car il va garder le dernier MASQUE et écrase les précédents.

@+

#14 Programmation » Matlab: Centrer une lettre » 26-05-2011 12:38:07

stormin
Réponses : 2

Bonsoir,
Le centrage d'une lettre E dans une image de fond noir de taille 256*256.

%% Calcul du barycentre de E
nbpoint1 = sum(E(:));
[valeury1 valeurx1] = find(E);
bary_y1 = round(sum(valeury1)/nbpoint1);
bary_x1 = round(sum(valeurx1)/nbpoint1);

%% Calcul du décalage à faire
[M1 N1]=size(E);
centreimagey1=round(M1/2);
centreimagex1=round(N1/2);
dy1=centreimagey1-bary_y1;
dx1=centreimagex1-bary_x1;

%% Centrage de E
Ecentre = zeros(M1,N1);
if(dx1>=0 && dy1>=0)
    Ecentre(dy1+1:end,dx1+1:end) = E(1:M1-dy1,1:N1-dx1);
elseif(dx1>0 && dy1<0)
    Ecentre(1:M1+dy1,dx1+1:end) = E(-dy1+1:end,1:N1-dx1);
elseif(dx1<0 && dy1>0)
    Ecentre(dy1+1:end,1:M1+dx1) = E(1:M1-dy1,-dx1+1:end);
elseif(dx1<0 && dy1<0)
    Ecentre(1:M1+dy1,1:N1+dx1) = E(-dy1+1:end,-dx1+1:end);
end

Je devrais centrer la lettre E dans les coordonnées (128,128),mais la vérification me montre qu'elle est centrée autour de (129,129) et je vois pas l'erreur que j'ai commis.

Merci

#15 Re : Programmation » Matlab: test répétitif dans while » 25-05-2011 11:58:36

Salut,

Donc tu vas essayé de mettre un "mouchard" entre le else et le end, un simple compteur que tu unitialises à zéro au tout début...

Code:

    if (MAXIC==MAXC) && (MINIA==MINA)
        Matrice=Matrice.*MASQUE;  
    else      
        Test=Test.*MASQUE;
        MASQUE=ones(256,256);
        compteur=compteur+1; %% Inisialisé à zéro
    end

Il m'a donné à fin de la boucle comme résultat: 69

C'est à dire que dans le cas où MAXIC~=MAXC, il ne contrôle pas si MINIA==MINA et passe à else...
Bizarre...

Moi ,je cherche à faire cela,si l'un des deux conditions n'est pas vérifiée,je passe à else.
Pour Test,je l'affiche continuellement lors du calcul,il est toujours remplie des 1.

@+

#16 Re : Programmation » Matlab: test répétitif dans while » 24-05-2011 22:24:56

Bonsoir,

Conclusion : la matrice MASQUE n'est composée que de 1 et ne comprend aucun 0.

J'ai vérifie MASQUE,il contient des 0 et des 1.

ES-tu vraiment obligé de préciser maximum indice et minimum indice au lieu de Indice tout court ?

Oui je suis obligé.

Vraiment,je vois pas pourquoi Test contient uniquement des 1.

#17 Re : Programmation » Matlab: test répétitif dans while » 24-05-2011 17:31:31

Salut,

A chaque fois que min ou le max changeront,je dois faire deux choses:

1-Conserver la dernière valeur de MASQUE. 

 

 Test=Test.*MASQUE;

.*:Permet de faire la multiplication élément par élément.
 
   
2- Initialiser MASQUE.

MASQUE=ones(256,256);

Au lieu que je trouve dans Test des 0 et 1,parce que à chaque fois min ou max changeront je met MASQUE dans Test, je vois qu'il y a présence seulement des 1.

#18 Re : Programmation » Matlab: test répétitif dans while » 24-05-2011 17:00:36

Salut,

J'ai testé vos propositions,mais je vois pas l’intérêt de MASQUEB ,la dernière valeur de MASQUE,je la mets dans Test.

Merci

#19 Re : Programmation » Matlab: test répétitif dans while » 24-05-2011 12:56:30

Re?

A chaque fois que min ou le max changeront tu veux réinitialiser le Masque et conserver l'ancien

Oui,c'est ça.

Réinitialiser le masque, c'est ça : MASQUE=ones(256,256); ?

Oui.

@+

#20 Re : Programmation » Matlab: test répétitif dans while » 24-05-2011 12:12:55

Bonjour,

Ainsi tu n'appliques la ligne que si MAXC ou MINA sont restés les mêmes d'un tour sur l'autre

J'applique la ligne si le MAXC et MINA sont restés les mêmes.

Il reste un truc à faire,il faut à chaque fois le max et le min change,que j'initialise MASQUE et conserver le dernier MASQUE.
Lorsque,je vérifie Test à la fin,je trouve seulement les 1,sachant que c'est la variable où je stocke les MASQUES.


Le programme:

epse=0.0075;
epsilon = 0.005;
MAXC=0 ;
MINA=0 ;
Test=ones(256,256);
MASQUE=ones(256,256);

somme = sum(MASQUE(:));

while(abs(somme)>epsilon)
                         

   
A_Auto_Cor1=fftshift(ifft2(A_Auto_Cor1.*MASQUE));
G1=abs(A_Auto_Cor1).^2;

A_Auto_Cor2=fftshift(ifft2(A_Auto_Cor2.*MASQUE));
G2=abs(A_Auto_Cor2).^2;

A_Auto_Cor3=fftshift(ifft2(A_Auto_Cor3.*MASQUE));
G3=abs(A_Auto_Cor3).^2;


X_XCor1=fftshift(ifft2(X_XCor1.*MASQUE));
G4=abs(X_XCor1).^2;

X_XCor2=fftshift(ifft2(X_XCor2.*MASQUE));
G5=abs(X_XCor2).^2;

X_XCor3=fftshift(ifft2(X_XCor3.*MASQUE));
G6=abs(X_XCor3).^2;


   
[A1 ID1] = max(G1(:));
[A2 ID2] = max(G2(:));
[A3 ID3] = max(G3(:));

[M1 id1] = max(G4(:));
[M2 id2] = max(G5(:));
[M3 id3] = max(G6(:));

M123=[M1 M2 M3];
A123=[A1 A2 A3];

MAXIC=MAXC ;
MINIA=MINA ;

MAXC=max(M123)
MINA=min(A123)

if     MAXC==M1
    trans_four_C=TF7;
   elseif MAXC==M2
    trans_four_C=TF8;
   else
    trans_four_C=TF9;
end    

if     MINA==A1
    trans_four_A=TF1;
   elseif MINA==A2
    trans_four_A=TF2;
   else
    trans_four_A=TF3;
end


%% DC

Matrice=abs(trans_four_C).*cos(angle(trans_four_C) - angle(trans_four_A))-epse*abs(trans_four_A);

if (MAXIC==MAXC) && (MINIA==MINA)
    Matrice=Matrice.*MASQUE;
   
    else
       
    Test=Test.*MASQUE;
    MASQUE=ones(256,256);
end

somme = sum(Matrice(:));

    if (abs(somme)<epsilon),break,end      

           if somme>0
           [maximum indice] = max(Matrice(:));
           
       
       
           else
           [minimum indice] = min(Matrice(:));
           
       
           end
           Matrice(indice) = 0;
           MASQUE(indice) = 0;
    somme = sum(Matrice(:));
end

MASQUE=MASQUE.*Test;
Q=fftshift(ifft2(CC.*MASQUE));

G=abs(Q).^2;

#21 Re : Programmation » Matlab: test répétitif dans while » 23-05-2011 21:53:53

Bonsoir,

Avant il faut que je comprenne quelque chose...
Ta boucle while, elle s'arrête bien ici :     
     somme = sum(Matrice(:));
end  ?

Oui.

#22 Programmation » Matlab: test répétitif dans while » 23-05-2011 19:12:07

stormin
Réponses : 20

Bonsoir,

J'aimerais savoir comment si le MAXC ou bien le MINA change,j'applique pas cette ligne:


Matrice=Matrice.*MASQUE;

Le programme:

epse=0.0075;
epsilon = 0.005;
MASQUE=ones(256,256);

somme = sum(MASQUE(:));

while(abs(somme)>epsilon)
                         

   
A_Auto_Cor1=fftshift(ifft2(A_Auto_Cor1.*MASQUE));
G1=abs(A_Auto_Cor1).^2;

A_Auto_Cor2=fftshift(ifft2(A_Auto_Cor2.*MASQUE));
G2=abs(A_Auto_Cor2).^2;

A_Auto_Cor3=fftshift(ifft2(A_Auto_Cor3.*MASQUE));
G3=abs(A_Auto_Cor3).^2;


X_XCor1=fftshift(ifft2(X_XCor1.*MASQUE));
G4=abs(X_XCor1).^2;

X_XCor2=fftshift(ifft2(X_XCor2.*MASQUE));
G5=abs(X_XCor2).^2;

X_XCor3=fftshift(ifft2(X_XCor3.*MASQUE));
G6=abs(X_XCor3).^2;


   
[A1 ID1] = max(G1(:));
[A2 ID2] = max(G2(:));
[A3 ID3] = max(G3(:));

[M1 id1] = max(G4(:));
[M2 id2] = max(G5(:));
[M3 id3] = max(G6(:));

M123=[M1 M2 M3];
A123=[A1 A2 A3];

MAXC=max(M123)
MINA=min(A123)

if     MAXC==M1
    trans_four_C=TF7;
   elseif MAXC==M2
    trans_four_C=TF8;
   else
    trans_four_C=TF9;
end    

if     MINA==A1
    trans_four_A=TF1;
   elseif MINA==A2
    trans_four_A=TF2;
   else
    trans_four_A=TF3;
end

%% DC

Matrice=abs(trans_four_C).*cos(angle(trans_four_C) - angle(trans_four_A))-epse*abs(trans_four_A);
Matrice=Matrice.*MASQUE;


somme = sum(Matrice(:));

    if (abs(somme)<epsilon),break,end      

           if somme>0
           [maximum indice] = max(Matrice(:));
           Matrice(indice) = 0;
           MASQUE(indice) = 0;
       
       
           else
           [minimum indice] = min(Matrice(:));
           Matrice(indice) = 0;
           MASQUE(indice) = 0;
       
       
       
           end
    somme = sum(Matrice(:));
end

#23 Re : Programmation » [Python]Remplacement d'éléments de matrice tant que somme <>0 » 22-05-2011 21:41:34

As-tu
- essayé de travailler avec des nombres entiers tous égaux à 10000 fois le nombre correspondant initial,
- fait ensuite tourner le programme,
- redivisé par 10000 les nombres restants non nuls ?

Oui.

#24 Re : Programmation » [Python]Remplacement d'éléments de matrice tant que somme <>0 » 22-05-2011 18:09:02

Oui,j'ai abouti à une matrice non nulle et l'arrondissement fait son travail.
Le problème ,c'est que le masque binaire obtenu,diminue le pic mais ,il n'annule pas.

Pouvez vous me donner si possible,ton Email,pour que je vous envois le programme en Matlab ainsi que les images,pour que tu vois de près le résultat.
Et si vous connaissez quelqu'un en Matlab pourra m'aider.

Merci

#25 Re : Programmation » [Python]Remplacement d'éléments de matrice tant que somme <>0 » 22-05-2011 12:20:21

Tu veux dire par là, qu'à la sortie de la boucle la matrice est nulle ?

Non le contraire,avant l'arrondissement,la boucle sorte avec une matrice nulle,après l'arrondissement ,elle me donne une matrice non nulle.

Es-tu sûr d'avoir des nombres négatifs dans ta matrice ?

Oui.

Qu'est-ce que veux dire exactement "le bon masque" ?

J'ai deux images de taille 256*256,une scène contient deux lettres E et F,et une cible contient la lettre F,après une opération de corrélation,j'ai obtenu deux pics,l'un (F*F) et plus intense que l'autre(E*F),et mon objectif vise à faire diminuer le maximum l'intensité du pic E*F ,pour laisser seulement le pic F*F ,c'est à dire augmenter la capacité de discrimination:

Cela à travers la matrice:

Matrice=abs(TF4).*cos(angle(TF4) - angle(TF1))-0.1*abs(TF1);

Je veux faire le test jusqu'à avoir un équilibre entre la partie positive et négative,en remplacant par zéro le pixel qui ne remplie pas la condition (la somme égale à zéro).
Ce travail sur Matrice,c'est en quelque sorte la construction du masque binaire que je l'applique au résultat de corrélation pour bloquer certains pixels de façon à ne garder que le pic d’auto-corrélation et d'éliminer le pic de corrélation croisée.
J'ai diminuer le pic E*F,mais moi je cherche à l'éliminer à l'aide de masque de binaire .

Pour l'enregistrement dans http://www.cijoint.fr,il me signale un problème de email de confirmation.
Pseudo:stormin
Mot de passe:nomadstorm

Si vous avez besoin du programme en Matlab,et les images,je serai à votre disposition.

Voila la matrice:Matrice

http://www.cijoint.fr/cjlink.php?file=c … WGeBy6.txt

Pied de page des forums