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

Images Discussion :

Problème recalage 3D


Sujet :

Images

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Etudiant
    Inscrit en
    Juillet 2015
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Etudiant

    Informations forums :
    Inscription : Juillet 2015
    Messages : 29
    Points : 28
    Points
    28
    Par défaut Problème recalage 3D
    Bonjour,

    Je travaille sur le recalage 3D de scanners CBCT sur des CTMEP .
    J'ai utilisé http://fr.mathworks.com/help/images/...al-images.html , que j'ai appliqué .
    J'ai effectué toutes les étapes sur cette page et cela fonctionne .
    Mais je rencontre un problème lorsque j'essaie de faire varier la coupe :
    Si j'ai bien saisi , on se place au centre à chaque fois puisque l'on fait fixedCenter = size(fixedVolume)/2.
    Que l'on utilise dans imshowpair( fixedVolume(:,:,fixedCenter(3)). J'ai donc voulu faire varier fixedCenter(3) , et prendre par exemple 55 ( de même pour MovingCenter ).
    Et bizarrement, je ne recale rien du tout, et j'obtiens une image violette.
    Mon volume fixed fait 256 x 256 x 215 et mon volume Moving 256 x 256 x 64.

    Merci d'avance pour votre aide .

  2. #2
    Membre habitué
    Profil pro
    Doctorante
    Inscrit en
    Mai 2012
    Messages
    130
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Doctorante

    Informations forums :
    Inscription : Mai 2012
    Messages : 130
    Points : 197
    Points
    197
    Par défaut
    Salut,

    Je viens de regarder le lien que tu as fourni. Tu peux poster ton code stp? Le code qui fonctionne et le code modifié avec ta valeur 55 ou autre.
    Aussi, avant ça, est-ce que tu peux essayer de tester ton code avec des valeurs autour de 110 (au lieu du 55), genre 130,120, 110, 100, 90, 80, 70 et me dire si ça fonctionne pour certaines valeurs et pas pour d'autres.

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    Etudiant
    Inscrit en
    Juillet 2015
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Etudiant

    Informations forums :
    Inscription : Juillet 2015
    Messages : 29
    Points : 28
    Points
    28
    Par défaut
    Merci d'abord pour votre réponse .
    Voici le code qui fonctionne :

    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
    fixedHeader = results{3,4}(:,:,54);
    movingHeader = CBCT1pat1Header(:,:,16);
    fixedVolume = mat_rsFixed;
    movingVolume = mat_rsMoving;
    centerFixed = size(fixedVolume)/2;
    centerMoving = size(movingVolume)/2;
    fig=figure;
    fig,imshowpair(movingVolume(:,:,round(centerMoving(3))), fixedVolume(:,:,round(centerFixed(3))));
    [optimizer metric] = imregconfig('monomodal');
    Rfixed = imref3d(size(fixedVolume), fixedHeader.PixelSpacing(2), fixedHeader.PixelSpacing(1), fixedHeader.SliceThickness);
    Rmoving = imref3d(size(movingVolume), movingHeader.PixelSpacing(2), movingHeader.PixelSpacing(1), movingHeader.SliceThickness);
    movingRegisteredVolume = imregister(movingVolume,Rmoving, fixedVolume,Rfixed, 'rigid', optimizer, metric);
    fig2 = figure;
    fig2,imshowpair(movingRegisteredVolume(:,:,round(centerFixed(3))), fixedVolume(:,:,round(centerFixed(3))));
    geomtform = imregtform(movingVolume,Rmoving, fixedVolume,Rfixed, 'rigid', optimizer, metric)
    Pour vous expliquer je travaille sur des CT ( moving ) et des CTMEP ( scanner de mise en place, Fixed ) . J'ai stocké dans fixedHeader et movingHeader les informations concernant la coupe ( toutes les propriétés, mais que deux sont utiles par la suite SliceThickness et PixelSpacing). Je me suis rendu compte que ces deux infos étaient les mêmes pour toutes les coupes, donc je peux mettre n'importe quelle coupe dans fixedHeader et movingHeader.
    Ensuite, je stocke mes volumes ( que j'ai resize car à la base j'avais du 512x512 mais le temps de recalage était trop important, alors je suis passé à 256).

    Les seules choses que j'ai modifiées sont :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    centerFixed = size(fixedVolume)/4;
    centerMoving = size(movingVolume)/4;
    par exemple.
    Du coup, lorsque je fais mon premier imshow, normal, je superpose mes deux scanners, un en violent , l'autre en vert et on voit qu'ils sont décalés ( jusque là aucun problème).
    Et c'est lors de mon deuxième et dernier imshow avec movingregisteredvolume, où j'devrais avoir mes deux images superposées et voir donc du gris , et ben je me rends compte que je n'ai que le scanner violet, le vert à disparu.
    Il a qqch entre mes deux imshow qui a amené cette erreur mais quoi...

    J'espère avoir été suffisamment clair.

  4. #4
    Membre habitué
    Profil pro
    Doctorante
    Inscrit en
    Mai 2012
    Messages
    130
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Doctorante

    Informations forums :
    Inscription : Mai 2012
    Messages : 130
    Points : 197
    Points
    197
    Par défaut
    Ok ce que je ne saisis pas c'est est-ce que ta première implémentation fonctionne ( = quand tu fixes centerFixed = size(fixedVolume)/2;
    centerMoving = size(movingVolume)/2 ? Est-ce que dans ce cas-là tes 2 images sont bien superposées ? Est-ce que c'est uniquement quand tu modifies les valeurs de centerFixed et centerMoving que ça ne fonctionne plus ?

    As-tu essayé avec les valeurs que je t'avais fournies (ou plusieurs autres valeurs entre 0 et 215) ? Est-ce que ça donne toujours le même résultat ?
    Par exemple si tu fais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    centerFixed = size(fixedVolume)/2 -10; 
    centerMoving = size(movingVolume)/2;
    Tes images devraient être presque alignées dans ce cas si je comprends bien comment le code fonctionne.

    J'ai l'impression que les valeurs de centerFixed et centerMoving sont des points de références (= des points dont on sait qu'ils représentent la même chose).
    Si ton point de référence est (centerFixed/2) et (centerMoving/2) alors ça me paraitrait logique que les images ne soient pas ou mal superposées pour d'autres valeurs...

  5. #5
    Nouveau membre du Club
    Homme Profil pro
    Etudiant
    Inscrit en
    Juillet 2015
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Etudiant

    Informations forums :
    Inscription : Juillet 2015
    Messages : 29
    Points : 28
    Points
    28
    Par défaut
    Oui oui quand je laisse /2 , il n'y a aucun problème !
    Mais comme je vous ai dit , j'ai essayé /4 par exemple, et j'ai exécuté mon code petit par petit, j'ai d'abord affiché mes simples images sans recalage, superposées, et elles apparaissent bien. Le problème survient dans le recalage, où là , l'image verte disparaît et, il ne reste que le scanner violet.
    Je peux vous montrer des photos si vous le souhaitez.

    Et sinon oui j'ai fait varier, en prennant /4 /6 /8 etc mais la même chose.

    Nom : 256montage.jpg
Affichages : 237
Taille : 16,9 KoNom : 256registered.jpg
Affichages : 226
Taille : 9,3 KoNom : 256unregistered.jpg
Affichages : 246
Taille : 11,1 Ko

    Dans cet exemple, j'ai divisé par 4.

  6. #6
    Nouveau membre du Club
    Homme Profil pro
    Etudiant
    Inscrit en
    Juillet 2015
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Etudiant

    Informations forums :
    Inscription : Juillet 2015
    Messages : 29
    Points : 28
    Points
    28
    Par défaut
    J'ai essayé le code que vous m'avez conseillé, et j'ai bien un recalage correct du coup.
    J'ai essayé de faire -10 à chaque size/2 par exemple, et j'obtiens des recalages correct.

    Mais pourquoi /4 ne fonctionne pas ^o)?

  7. #7
    Membre habitué
    Profil pro
    Doctorante
    Inscrit en
    Mai 2012
    Messages
    130
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Doctorante

    Informations forums :
    Inscription : Mai 2012
    Messages : 130
    Points : 197
    Points
    197
    Par défaut
    Sans pouvoir faire tourner le code, difficile de voir ce qui bloque...
    Tu peux faire tourner le programme ligne par ligne et regarder les valeurs des paramètres à chaque fois et en particulier, celle qui changent entre tes 2 scénarios.

    Par exemple, le problème pourrait venir du header. Si j'en crois la documentation, un des paramètres est le nombre de slices de ton volume. Es-tu sûr que dans ton dernier affichage, la valeur de la slice verte que tu souhaites afficher ne dépasse pas le nombre de slices présentes dans le volume "vert" ?

    Je continue à dire que tu devrais essayer avec les valeurs
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    centerFixed = size(fixedVolume)/2 - 10; % ou -5 ou -2
    centerMoving = size(movingVolume)/2;
    et aussi
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    centerFixed = size(fixedVolume)/2; 
    centerMoving = size(movingVolume)/2 - 10; % ou -5 ou -2
    Ca permettrait de voir si le problème vient justement d'un dépassement des bornes...

  8. #8
    Nouveau membre du Club
    Homme Profil pro
    Etudiant
    Inscrit en
    Juillet 2015
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Etudiant

    Informations forums :
    Inscription : Juillet 2015
    Messages : 29
    Points : 28
    Points
    28
    Par défaut
    Ben , comme je vous l'ai dit, j'ai essayé votre code et cela fonctionne , mes recalages sont corrects lorsque j'enlève 10 à l'un ou l'autre .

    Je commence à penser que le problème pourrait être le header...
    Mais je ne vois pas comment je pourrais dépasser le nb de slice sachant que j'arrive à afficher mon premier imshowpair , et que j'ai bien un slice verte et une violette. Qu'est ce qui pourrait arriver entrel es deux qui ferait que je dépasse et qu'elle se fasse manger?

    Au lieu de faire /4 directement, j'ai essayé de faire -54 à l'un, et -16 à l'autre, au lieu de tout faire /4. Et je retombe sur qqch de pas recaler et de tout violé

  9. #9
    Nouveau membre du Club
    Homme Profil pro
    Etudiant
    Inscrit en
    Juillet 2015
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Etudiant

    Informations forums :
    Inscription : Juillet 2015
    Messages : 29
    Points : 28
    Points
    28
    Par défaut
    Sur le lien que je vous ai envoyé, il y a une matrice de transformation 4x4 à la fin ( je suppose que les lignes représentent les transformations comme rotation, translation, homothétie etc).
    Je suis sensé, à la fin de mon recalage, récupérer une matrice de transformation que je dois ensuite appliqué pour effectuer mon recalage. Voyez vous ce que je veux dire ? car je suis un peu perdu.

  10. #10
    Membre habitué
    Profil pro
    Doctorante
    Inscrit en
    Mai 2012
    Messages
    130
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Doctorante

    Informations forums :
    Inscription : Mai 2012
    Messages : 130
    Points : 197
    Points
    197
    Par défaut
    Ok, je vais y regarder cette fin de semaine. Le fait que ça fonctionne quand tu fais des petites variations autour des valeurs de size(fixedVolume)/2 et size(movingVolume)/2 m'amène à penser que le "problème" vient des bornes.

    De ton côté, tu peux regarder à partir de quelle valeur l'image verte ne s'affiche plus (tu y vas pas à pas : -10, -15,-20,...). A mon avis, tu vas trouver que lorsque tu dépasses la valeur du nombre de slices (qui est dans le header) divisé par 2, les problèmes d'affichage commencent. Je veux bien que tu me dises la valeur exacte à partir de laquelle ça ne fonctionne plus avant que je commence à mettre le nez plus dans ton programme. Ca me donnera une bonne indication de la direction dans laquelle chercher

  11. #11
    Nouveau membre du Club
    Homme Profil pro
    Etudiant
    Inscrit en
    Juillet 2015
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Etudiant

    Informations forums :
    Inscription : Juillet 2015
    Messages : 29
    Points : 28
    Points
    28
    Par défaut
    Bonjour,
    désolé pour la lenteur de la réponse .

    J'ai fait des variations à centerFixed = size(fixedVolume)/2 valant [128 128 107.5] , lorsque je fais -40 j'ai un recalage correct ( en laissant l'autre centerFixed = size(fixedVolume)/2 valant [128 128 64] ) . Le problème commence à apparaître à -45 , puis encore un peu à -50 puis totalement à -54/-55 .

    Le fait est que les informations sur le header ( pixelSpacing, et SliceThickness ) sont les mêmes poru toutes les coupes donc le choix de coupe movingHeader et fixedHeader (:,:,j) c'est quelque soit j.

  12. #12
    Membre habitué
    Profil pro
    Doctorante
    Inscrit en
    Mai 2012
    Messages
    130
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Doctorante

    Informations forums :
    Inscription : Mai 2012
    Messages : 130
    Points : 197
    Points
    197
    Par défaut
    Ok, avec ce que tu dis ici, à mon avis, quand tu prends des valeurs trop importantes, ta deuxième image sort simplement du cadre d'affichage.

    Etant donné que tu as trouvé que la valeur de -40 te donne le recalage optimal, est-ce que ta question est résolue ?

    Quel est le problème global que tu souhaites résoudre ? Trouver le recalage optimal entre les 2 images ?

  13. #13
    Nouveau membre du Club
    Homme Profil pro
    Etudiant
    Inscrit en
    Juillet 2015
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Etudiant

    Informations forums :
    Inscription : Juillet 2015
    Messages : 29
    Points : 28
    Points
    28
    Par défaut
    Ben à la base , je devais donner à mon maître de stage des photos du recalage à différents niveaux du patient, du coup j'avais essayé de faire varier ça et j'avais eu le problème à partir d'une certaine valeur enfaite !

  14. #14
    Nouveau membre du Club
    Homme Profil pro
    Etudiant
    Inscrit en
    Juillet 2015
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Etudiant

    Informations forums :
    Inscription : Juillet 2015
    Messages : 29
    Points : 28
    Points
    28
    Par défaut
    Savez vous comment s'utilise la matrice de transformation 4x4 ?

  15. #15
    Membre habitué
    Profil pro
    Doctorante
    Inscrit en
    Mai 2012
    Messages
    130
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Doctorante

    Informations forums :
    Inscription : Mai 2012
    Messages : 130
    Points : 197
    Points
    197
    Par défaut
    C'est la matrice qui encode les transformations en translation/rotation/changement d'échelle que doit subir l'image qui bouge afin d'être recalée sur l'image fixe.
    Dans le cas d'une image 2D tu auras une matrice 3*3 et dans le cas d'un volume une matrice 4*4.

    Sur ce thread (en anglais), tu peux voir dans le premier post un exemple de translation d'un volume.

  16. #16
    Nouveau membre du Club
    Homme Profil pro
    Etudiant
    Inscrit en
    Juillet 2015
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Etudiant

    Informations forums :
    Inscription : Juillet 2015
    Messages : 29
    Points : 28
    Points
    28
    Par défaut
    Merci pour votre réponse, je vais regarder plus en détail .
    Dans ma tête c'était une matrice à appliquer à mon volume, mais ce qui me gènait c'était la taille : comment appliquer une 4x4 sur une matrice 512x512x64 par exemple..

  17. #17
    Nouveau membre du Club
    Homme Profil pro
    Etudiant
    Inscrit en
    Juillet 2015
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Etudiant

    Informations forums :
    Inscription : Juillet 2015
    Messages : 29
    Points : 28
    Points
    28
    Par défaut
    Je remodifie mon message :
    http://fr.mathworks.com/help/images/...#zmw57dd0e2284
    Step 4 correspond bien à l'application de ma transformation ? movingRegisteredVolume est bien ma nouvelle image, mon volume qui devait se recaler sur le fixed, et qui maintenant " aligné " c'est bien ça?
    Parce que je ne comprends pas la différence entreles deux movingRegisteredVolume.

    Merci d'avance .

  18. #18
    Nouveau membre du Club
    Homme Profil pro
    Etudiant
    Inscrit en
    Juillet 2015
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Etudiant

    Informations forums :
    Inscription : Juillet 2015
    Messages : 29
    Points : 28
    Points
    28
    Par défaut
    Ou peut être que le premier movingRegisteredVolume est mon volume recalé
    Et que Step4 montre comment appliquer de manière générale , à partir de la matrice de transformation, à un autre volume directement avec imwarp, c'est ça?

  19. #19
    Membre habitué
    Profil pro
    Doctorante
    Inscrit en
    Mai 2012
    Messages
    130
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Doctorante

    Informations forums :
    Inscription : Mai 2012
    Messages : 130
    Points : 197
    Points
    197
    Par défaut
    Ou peut être que le premier movingRegisteredVolume est mon volume recalé
    Oui, c'est le volume recalé.

  20. #20
    Nouveau membre du Club
    Homme Profil pro
    Etudiant
    Inscrit en
    Juillet 2015
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Etudiant

    Informations forums :
    Inscription : Juillet 2015
    Messages : 29
    Points : 28
    Points
    28
    Par défaut
    Et bien merci ! Pour éviter de recréer une discussion, sur le même type de sujet car je risque de r'avoir une ou deux questions, je peux continuer à poser sur ce fil ou préférez vous que j'ouvre un nouveau fil?

Discussions similaires

  1. Problème d'installation oracle 8.1.7 sous NT
    Par Anonymous dans le forum Installation
    Réponses: 7
    Dernier message: 02/08/2002, 14h18
  2. Problème d'impression
    Par IngBen dans le forum C++Builder
    Réponses: 7
    Dernier message: 22/05/2002, 11h37
  3. Problème avec la mémoire virtuelle
    Par Anonymous dans le forum CORBA
    Réponses: 13
    Dernier message: 16/04/2002, 16h10
  4. Réponses: 6
    Dernier message: 25/03/2002, 21h11

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