IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

MATLAB Discussion :

remplacer des éléments d'une matrice dans une boucle FOR


Sujet :

MATLAB

  1. #1
    Membre expert
    Avatar de Clotho
    Homme Profil pro
    R&D
    Inscrit en
    Avril 2011
    Messages
    1 524
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : R&D
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2011
    Messages : 1 524
    Points : 3 383
    Points
    3 383
    Par défaut remplacer des éléments d'une matrice dans une boucle FOR
    Salut tout le monde.

    J'avance (tout) doucement dans la création d'un algorithme de traitement d'images, et me retrouve confronté à un problème que j'ai du mal à définir, et donc du mal à résoudre.

    Pour la culture: je veux faire un traitement d'image sur une acquisition video en 640*480. Pour diminuer la charge de travail, j'ai fait une ROI circulaire centrée. Sur cette matrice, je veux appliquer une suite de masques (des cercles concentriques de dimension croissante).

    J'ai réussi à:
    modéliser mon masque "tout ou rien" de ma vidéo.
    modéliser ma matrice de masquage, comportant 20 cercles.
    appliquer la multiplication de l'une par l'autre, afin de trouver mes portions de masque à appliquer dans mon algo ultérieurement.

    Ma matrice principale fait 480*640
    mes matrices de masque font 201*201


    voici le code (non fonctionnel, il manque les fichiers initiaux de masquage et de max détectés)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    load masquage.mat %matrice de masquage
    load coordonnees_max.mat %max détectés via un autre script
     
    nb_max=size(maxi,1);
    masquelong=mask.Length;
    nb_images=masquelong*nb_max;
     
    masque_roi=cell(nb_max,masquelong); %prealloc
    champ_cam_vide=zeros(480,640); %prealloc
     
    %% création de la ROI centrale.
     
    champ_cam=zeros(480,640);
     
    struc_centr=strel('disk',200,0);
    roi_chem=getnhood(struc_centr); %créé une matrice de 401*401 avec un cercle ne comportant que des 1, et l'extérieur ne comportant que des 0
     
    %on veut insérer un cadre de 401*401 dans une matrice de 480*640, et ce, de façon (+/-) centrée.
     
    x_add=(480-400)/2;
    y_add=(640-400)/2;
     
    champ_cam(x_add:x_add+400,y_add:y_add+400)=roi_chem; %matrice de 640*480 avec un cercle rempli de 1 au milieu
     
    clear roi_chem struc_chem x_add y_add %coup de balai
     
    %% application du masque en fonction des maxima détectés.
    for i=1:nb_max
        coord_x_max=max(i,1); %extraction des x et des y de chaque max détecté
        coord_y_max=max(i,2);
     
        for j=1:masquelong
            imagemasque=getdatasamples(mask,j); %lecture pas à pas du masque à appliquer
            masque_roi{i,j}=champ_cam(coord_x_max+100:coord_x_max+300,coord_y_max+100:coord_y_max+300).*imagemasque; %création d'un masque sur une ROI, mise en mémoire en tableau de cellules
     
     
        end
    end
     
    linearisation=reshape(masque_roi,1,nb_images);
    Je bute dans la boucle "for" imbriquée: je voudrai intégrer chacune de mes valeurs de masque_roi{i,j} dans une matrice nulle de 480/640 mais je n'arrive pas à conceptualiser la chose au delà. Je n'arrive pas à faire d'indexation de type
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    roi_finale(x_add:x_add+200,y_add:y_add+200)=masque_roi{i,j}
    et encore moins

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    roi_finale{i,j}(x_add:x_add+200,y_add:y_add+200)=masque_roi{i,j}[/
    Je ne sais même pas comment chercher une réponse dans l'aide ou le forum a ce sujet.

    Si vous arrivez à me comprendre (sait-on jamais ) est-ce faisable? si oui, comment?
    Un message vous a aidé? Votez pour moi! J'aime qu'on me dise qu'on m'aime.

    Si la question a obtenu sa réponse, passez le sujet en résolu.

    "Citer les pensées des autres, c'est regretter de ne pas les avoir trouvées soi-même" S.Guitry

  2. #2
    Modérateur

    Homme Profil pro
    Ingénieur en calculs scientifiques
    Inscrit en
    Août 2007
    Messages
    4 639
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Ingénieur en calculs scientifiques

    Informations forums :
    Inscription : Août 2007
    Messages : 4 639
    Points : 7 614
    Points
    7 614
    Par défaut
    Bonjour,

    la ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    roi_finale(x_add:x_add+200,y_add:y_add+200)=masque_roi{i,j}
    renvoie une erreur? si oui laquelle?

    Quant à la deuxième ligne je ne l'ai pas comprise, il manque un bout en fin de ligne, non?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    roi_finale{i,j}(x_add:x_add+200,y_add:y_add+200)=masque_roi{i,j}[/
    Pour une bonne utilisation des balises code c'est ici!
    Petit guide du voyageur MATLABien : Le forum La faq Les tutoriels Les sources


    La nature est un livre écrit en langage mathématique. Galilée.

  3. #3
    Membre expert
    Avatar de Clotho
    Homme Profil pro
    R&D
    Inscrit en
    Avril 2011
    Messages
    1 524
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : R&D
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2011
    Messages : 1 524
    Points : 3 383
    Points
    3 383
    Par défaut
    Hello,

    Alors en répondant du bas vers le haut: la dernière ligne avec [/ c'est une erreur au moment d'écrire mon message, je n'y ai pas prêté attention, c'est la fin de la balise code...

    pour
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    roi_finale(x_add:x_add+200,y_add:y_add+200)=masque_roi{i,j}
    il fallait en fait lire:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    roi_finale(coord_x_max+200:coord_x_max+200,coord_y_max+200:coord_y_max+200)=masque_roi{i,j}
    Les message d'erreur est différent selon que je fasse une préallocation de roi_finale en tant que tableau de cellules ou en tant que matrices nulle. De base il est:

    ??? Cell contents assignment to a non-cell array object.

    Error in ==> roi_cheminee at 35
    roi_finale{i,j}(coord_x_max:coord_x_max+200,coord_y_max:coord_y_max+200)=masque_roi{i,j};
    Et si je déclare roi_finale en tant que cell array j'ai un résultat que je ne m'explique pas, en lieu et place d'une matrice de 480/640 j'ai ma matrice "masque_roi".
    Un message vous a aidé? Votez pour moi! J'aime qu'on me dise qu'on m'aime.

    Si la question a obtenu sa réponse, passez le sujet en résolu.

    "Citer les pensées des autres, c'est regretter de ne pas les avoir trouvées soi-même" S.Guitry

  4. #4
    Membre expert
    Avatar de Clotho
    Homme Profil pro
    R&D
    Inscrit en
    Avril 2011
    Messages
    1 524
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : R&D
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2011
    Messages : 1 524
    Points : 3 383
    Points
    3 383
    Par défaut
    Pour faire un exemple plus simple, dans le cas ou j'ai une matrice comme ceci:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    A=zeros(5) 
    B=[0 1;1 1]
    Je veux que selon un vecteur C [ 1 2] (par exemple) ma matrice B soit introduite dans les valeurs de A afin d'avoir une matrice:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     final=[0 0 0 0 0; 0 0 1 0 0; 0 1 1 0 0;0 0 0 0 0; 0 0 0 0]
    Ca sera plus joli dans matlab.

    J'arrive a faire une opération "simple" comme ca, comme je fais dans la première partie de mon code mais n'arrive pas à l'introduide dans ma boucle, a partir de tableau de cellules et du vecteur C variable.
    Un message vous a aidé? Votez pour moi! J'aime qu'on me dise qu'on m'aime.

    Si la question a obtenu sa réponse, passez le sujet en résolu.

    "Citer les pensées des autres, c'est regretter de ne pas les avoir trouvées soi-même" S.Guitry

  5. #5
    Invité
    Invité(e)
    Par défaut
    Avec ton exemple simple, cela donnerait quelque chose comme:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    A=zeros(5);
    B=[0 1;1 1];
    [m n] = size(B);
    i = 2; j = 2;
    A(i:i+m-1,j:j+n-1) = B

  6. #6
    Membre expert
    Avatar de Clotho
    Homme Profil pro
    R&D
    Inscrit en
    Avril 2011
    Messages
    1 524
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : R&D
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2011
    Messages : 1 524
    Points : 3 383
    Points
    3 383
    Par défaut


    En fait d'avoir simplifié mon gloubiboulga infâme et en mixant ce que tu m'as donné et mon modèle initial (oui, je tiens à mes boucles for, n'ayant jamais fait d'informatique jusqu'à y a trois mois je vois pas trop comment les éviter) j'ai réussi a sortir un "squelette" fonctionnel que je m'en vais adapter de ce pas, la bave aux lèvres et la bière à la main!

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    A=zeros(5);
    B_1=[0 1;1 1];
    B_2=[0 0;1 0];
    C=[1 2; 2 1];
    D=cat(3,B_1,B_2);
    E=cell(1,2);
     
    [m n o]=size(D);
     
    for i=1:2
     
        x=C(i,1);
        y=C(i,2);
     
        for j=1:o
            A(x:x+m-1,y:y+n-1)=D(:,:,j);
            E{i,j}=A;
        end
     
    end
    Merci!
    Un message vous a aidé? Votez pour moi! J'aime qu'on me dise qu'on m'aime.

    Si la question a obtenu sa réponse, passez le sujet en résolu.

    "Citer les pensées des autres, c'est regretter de ne pas les avoir trouvées soi-même" S.Guitry

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Remplacement d'une ligne par une autre dans une matrice
    Par Mathematiker dans le forum Scilab
    Réponses: 4
    Dernier message: 17/02/2015, 15h57
  2. portée d'une variable dans une fonction dans une méthode
    Par laurentg2003 dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 29/06/2009, 20h05
  3. [POO] dans une classe, appeler une fonction dans une méthode
    Par arnaudperfect dans le forum Langage
    Réponses: 3
    Dernier message: 27/08/2007, 00h04
  4. Envoyer une formulaire dans une page dans une Frame
    Par zooffy dans le forum Balisage (X)HTML et validation W3C
    Réponses: 5
    Dernier message: 29/06/2007, 11h13
  5. Recherche une valeur d'une cellule dans une colonne d'une autre feuille
    Par kourria dans le forum Macros et VBA Excel
    Réponses: 8
    Dernier message: 21/06/2007, 14h48

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo