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

Traitement d'images Discussion :

Vitesse et déplacement de nerfs humains à partir d'une vidéo ultrason


Sujet :

Traitement d'images

  1. #1
    Nouveau Candidat au Club
    Inscrit en
    Octobre 2008
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Octobre 2008
    Messages : 5
    Points : 1
    Points
    1
    Par défaut Vitesse et déplacement de nerfs humains à partir d'une vidéo ultrason
    Salut a tous,

    j'etudie en ce moment une licence "physique appliquee" en Australie et un projet m'a ete confie.

    Le but de ce projet est de developper un programme informatique sur Matlab qui a pour but de mesurer la vitesse et le deplacement de nerfs humains a partir d'une video ultrason (25 images/sec en niveaux de gris).
    Le probleme est que je n'ai aucune experience sur Matlab (version 7.5.0) et encore moins en traitement d'image; et mon tuteur ne m'est d'aucune aide, il est simplement la pour me noter.

    En fait, ce projet avait deja ete etudie auparavant, voici la technique qui fut utilisee :

    utilisation du template matching :

    -l'utilisateur selectionne la partie de la video qui l'interesse (c'est le template) avec la fonction "imcrop"
    -puis le programme compare le template avec les images de la videos grace a la cross correlation normalisee (normxcorr2)
    -la cross correlation retourne ensuite une matrice contenant les cordonnees de la position du template dans l'image
    -ces cordonnees sont ensuite stockees dans des matrices x et y
    -il est ensuite possible de tracer le graphique y=f(x), qui represente le deplacement du template.

    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
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
     
    % this code is able to track an object within a video, to plot the
    % trajectory and to calculate the velocity of the object
     
    % initialisations
     
    template_rows = 1;
    template_columns = 1;
    template_xmin = 1;
    template_ymin = 1;
     
     
     
    % importation of the video
     
    video = aviread('number 2.avi');
     
     
    % video_info is used to store the information about the video
    % (number of frames, format of frames, number of frames per second...)
     
    video_info = aviinfo('number 2.avi');
    NumFrames = video_info.NumFrames;
    FPS = video_info.FramesPerSecond;
     
     
    % the crop function is used here to extract the ultrasound image from all
    % frames
    % for example sometimes the frames have a Title and some comments that the
    % program doesn't need for the processing 
    % this enables to reduce the running time of the program
    % the user selects a rectangle containing the ultrasound image
     
    [crop,rect_image2] = imcrop(video(1).cdata);
     
     
    % the loop extract the ultrasound image part of each frames
     
    for j=1:NumFrames
        video(j).cdata = imcrop(video(j).cdata,rect_image2);
        video(j).cdata = rgb2gray(video(j).cdata);
    end
     
     
    image1 = video(1).cdata;
    [frame_rows,frame_columns] = size(image1); 
     
     
    % the crop function is used here to select the object that he is interested
    % in finding the trajectory and velocity of
     
    [template,rect_image1] = imcrop(image1);
     
    % the code below is saving informations about the rectangle selected by the
    % user (size, position ...)
     
    size_template = size(template);
    template_rows = size_template(1);
    template_columns = size_template(2);
    template_width = template_columns - 1;
    template_height = template_rows - 1;
    if rect_image1(1)<1
        rect_image1(1)=1;
    end
    if rect_image1(2)<1
        rect_image1(2)=1;
    end
     
     
    % the coordinates of the object are saved
     
    x_coordinates(1,1) = round(rect_image1(1))+((template_columns-1)/2);
    y_coordinates(1,1) = round(rect_image1(2))+((template_rows-1)/2);
     
     
    % the loop below computes the cross-correlation and finds the coordinates of
    % the object in all frames of the video
     
    for k=2:NumFrames
     
        image2 = video(k).cdata;
     
        corr = normxcorr2(template,image2);
     
        % the program using the function max_corr
        [corr_max_row,corr_max_column]=max_corr(corr);
     
        % this part is computing the updating of the template
     
        template_xmin = corr_max_column - template_width;
        template_ymin = corr_max_row - template_height;
        rect_template = [template_xmin, template_ymin, template_width, template_height];
        template = imcrop(image2,rect_template);
     
     
        % the coordinates of the object are saved
     
        x_coordinates(1,k) = corr_max_column - ((template_columns-1)/2);
        y_coordinates(1,k) = corr_max_row - ((template_rows-1)/2);
     
    end
     
     
    for i=1:NumFrames
        y_coordinates(1,i)=frame_rows - y_coordinates(1,i);
    end
     
     
    % the program asks the user to enter the frame length scale
     
    Scale = input('Dimension of the frames (in mm):\n');
     
     
    % the pixel length and the time between two consecutive frames are
    % calculated
     
    pixel_length = Scale/frame_columns;
    deltaT = 1/FPS;
     
    % the loop below calculates the velocity of the object for each frames
     
    for k=2:NumFrames-1
        offset_x = sqrt((x_coordinates(1,k+1)-x_coordinates(1,k-1))^2);
        offset_y = sqrt((y_coordinates(1,k+1)-y_coordinates(1,k-1))^2);
        velocity(1,k-1) = (sqrt(offset_x^2 + offset_y^2))/(2*deltaT);
    end
     
    % this corresponds to the plotting of the trajectory   
     
    subplot(2,1,1), plot(x_coordinates,y_coordinates,'o');
    axis([0 frame_columns 0 frame_rows]);
    xlabel('Pixels in the x axis');
    ylabel('Pixels in the y axis');
    title('trajectory of the object')
    subplot (2,1,2), plot(velocity);
    title ('velocity of the object');
     
     
    % the code below displays the velocity table
     
    velocity(:,:)
    Je suis charge d'ameliorer ce programme sur differents points de vue :

    - ameliorer la vitesse d'execution du programme en utilisant une methode autre que le template matching
    - etre capable de determiner la vitesse de deplacement de l'objet (nerf humain)
    - etre capable de mesurer deplacement et vitesse de plusieurs objets (nerfs humains) en meme temps
    - etre capable de prendre en compte les changements de formes des nerfs.

    J'ai deja passe pas mal de temps a faire des recherches internet mais je n'arrive pas trop a savoir sur quelle methode partir, je suis un peu perdu. L'utilisation du "flot optique" me paraissait pas mal...qu'en pensez-vous ? Sinon, sur quoi m'orienter ?


    J'espere que j'ai ete a peu pres clair dans ma description, je dois dire que j'ai moi meme un peu de mal a tout comprendre. Je m'excuse d'avance pour l'absence d'accents mais j'ecris via un clavier QWERTY.

    Merci d'avance, bonne journee

  2. #2
    Rédacteur/Modérateur

    Avatar de Jerome Briot
    Homme Profil pro
    Freelance mécatronique - Conseil, conception et formation
    Inscrit en
    Novembre 2006
    Messages
    20 302
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Freelance mécatronique - Conseil, conception et formation

    Informations forums :
    Inscription : Novembre 2006
    Messages : 20 302
    Points : 52 884
    Points
    52 884
    Par défaut
    Pour l'instant, c'est plus un problème d'algorithmique... je déplace la discussion dans le forum approprié
    Ingénieur indépendant en mécatronique - Conseil, conception et formation
    • Conception mécanique (Autodesk Fusion 360)
    • Impression 3D (Ultimaker)
    • Développement informatique (Python, MATLAB, C)
    • Programmation de microcontrôleur (Microchip PIC, ESP32, Raspberry Pi, Arduino…)

    « J'étais le meilleur ami que le vieux Jim avait au monde. Il fallait choisir. J'ai réfléchi un moment, puis je me suis dit : "Tant pis ! J'irai en enfer" » (Saint Huck)

  3. #3
    Modérateur
    Avatar de ToTo13
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Janvier 2006
    Messages
    5 793
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : Santé

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 793
    Points : 9 860
    Points
    9 860
    Par défaut
    Bonjour,

    les flots optiques est une technique de détection de mouvement => s'il n'y a que tes nerfs qui bougent, tu as gagné. Sinon il faut faire une segmentation de tes images afin d'extraire que la partie qui t'intéresse ,c'est-à-dire les nerfs.

    Est ce que tu peux mettre une de tes vidéos en ligne et nous donner le lien pour que l'on puisse voir comment pourrait se résoudre ce problème ?
    Consignes aux jeunes padawans : une image vaut 1000 mots !
    - Dans ton message respecter tu dois : les règles de rédaction et du forum, prévisualiser, relire et corriger TOUTES les FAUTES (frappes, sms, d'aurteaugrafe, mettre les ACCENTS et les BALISES) => ECRIRE clairement et en Français tu DOIS.
    - Le côté obscur je sens dans le MP => Tous tes MPs je détruirai et la réponse tu n'auras si en privé tu veux que je t'enseigne.(Lis donc ceci)
    - ton poste tu dois marquer quand la bonne réponse tu as obtenu.

  4. #4
    Nouveau Candidat au Club
    Inscrit en
    Octobre 2008
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Octobre 2008
    Messages : 5
    Points : 1
    Points
    1
    Par défaut
    Bonjour, merci pour vos reponses rapides.

    Voici donc le lien de la video : http://au.youtube.com/watch?v=as4GbcxQmfg

    Donc a priori, la methode des flots optiques pourrait fonctionner, reste a voir comment l'appliquer...

  5. #5
    Modérateur
    Avatar de ToTo13
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Janvier 2006
    Messages
    5 793
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : Santé

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 793
    Points : 9 860
    Points
    9 860
    Par défaut
    Bonjour,

    maintenant petite question : qu'est ce que l'on doit suivre exactement dans cette image ? Les nersfs (ok), mais à quoi ressemblent il exactement dans ce que l'on a vu.

    Par contre, je déplacement est uniforme sur toute l'image <=> tout bouge de manière parfaitement synchronisé. Donc il semblerait que quoique l'on cherche, il suffise de trouver un point et de suivre son mouvement pour trouver le mouvement de la totalité des points.
    Consignes aux jeunes padawans : une image vaut 1000 mots !
    - Dans ton message respecter tu dois : les règles de rédaction et du forum, prévisualiser, relire et corriger TOUTES les FAUTES (frappes, sms, d'aurteaugrafe, mettre les ACCENTS et les BALISES) => ECRIRE clairement et en Français tu DOIS.
    - Le côté obscur je sens dans le MP => Tous tes MPs je détruirai et la réponse tu n'auras si en privé tu veux que je t'enseigne.(Lis donc ceci)
    - ton poste tu dois marquer quand la bonne réponse tu as obtenu.

  6. #6
    Nouveau Candidat au Club
    Inscrit en
    Octobre 2008
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Octobre 2008
    Messages : 5
    Points : 1
    Points
    1
    Par défaut
    Ce que l'on doit suivre est en fait la grosse partie longitudinal qui ressemble a un os.
    Je pense aussi qu'il suffirait juste de selectionner une partie de ce nerf (c'est du moins ce qu'avait fait mon predecesseur en procedant au "template matching").

  7. #7
    Modérateur
    Avatar de ToTo13
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Janvier 2006
    Messages
    5 793
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : Santé

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 793
    Points : 9 860
    Points
    9 860
    Par défaut
    Bonjour,

    je suis entièrement d'accord avec l'approche qui avait été adopté par le prédécesseur. Quels en étaient les défaut pour vouloir la modifier ?

    Je ne suis pas sûr que les flots optiques apporteront une bonne solution sur cette vidéo car il y a très peu de contrastes dans cette image, surtout dans le sens du déplacement.
    Consignes aux jeunes padawans : une image vaut 1000 mots !
    - Dans ton message respecter tu dois : les règles de rédaction et du forum, prévisualiser, relire et corriger TOUTES les FAUTES (frappes, sms, d'aurteaugrafe, mettre les ACCENTS et les BALISES) => ECRIRE clairement et en Français tu DOIS.
    - Le côté obscur je sens dans le MP => Tous tes MPs je détruirai et la réponse tu n'auras si en privé tu veux que je t'enseigne.(Lis donc ceci)
    - ton poste tu dois marquer quand la bonne réponse tu as obtenu.

  8. #8
    Nouveau Candidat au Club
    Inscrit en
    Octobre 2008
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Octobre 2008
    Messages : 5
    Points : 1
    Points
    1
    Par défaut
    Bonjour,

    les defauts de l'ancienne methode est que le temps d'execution du programme etait assez long (environ 5 min): mon tuteur souhaiterait que j'ameliore la vitesse d'execution.

    J'avais donc pense a 2 choses :
    - soit utiliser une methode simplifiee de la "normalized cross correlation", j'avais pense aux SSD (summ of squared differences) ou SAD (sum of absolute difference).

    - soit utiliser une autre methode : les flots optiques par exemple.

    De plus, l'ancien programme ne permet pas de selectionner plusieurs nerfs en meme temps pour pouvoir ensuite les "tracker", c'est aussi l'un des objectifs de ce projet.

    Enfin, il m'est demande de mesurer la vitesse de deplacement des nerfs, chose qui n'a ete que partiellement traitee dans l'ancien programme.

    J'attends vos conseils, bonne journee.

  9. #9
    Modérateur
    Avatar de ToTo13
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Janvier 2006
    Messages
    5 793
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : Santé

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 793
    Points : 9 860
    Points
    9 860
    Par défaut
    Bonjour,

    5 minutes pour suivre un point il n'y a pas un bug quelque part ?
    Les flots optiques est une méthode de détection de mouvement temps réel Tu peux l'essayer pour commencer mais j'ai un doute.

    Comme ton flux est continu et plutôt simple (façon de parler), je commencerai par trouver un point caractéristique par simple segmentation et je le suivrai image par image sans refaire les calculs d'extraction.
    Consignes aux jeunes padawans : une image vaut 1000 mots !
    - Dans ton message respecter tu dois : les règles de rédaction et du forum, prévisualiser, relire et corriger TOUTES les FAUTES (frappes, sms, d'aurteaugrafe, mettre les ACCENTS et les BALISES) => ECRIRE clairement et en Français tu DOIS.
    - Le côté obscur je sens dans le MP => Tous tes MPs je détruirai et la réponse tu n'auras si en privé tu veux que je t'enseigne.(Lis donc ceci)
    - ton poste tu dois marquer quand la bonne réponse tu as obtenu.

  10. #10
    Nouveau Candidat au Club
    Inscrit en
    Octobre 2008
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Octobre 2008
    Messages : 5
    Points : 1
    Points
    1
    Par défaut
    Bonjour,

    tout d'abord merci de vous interesser un peu a mon cas.

    savez ou je pourrais trouver des exemples d'algorithmes "Matlab" utilisant les flots optiques ? Un exemple de depart m'aiderait bien pour commencer...

    Quant a votre suggestion de "trouver un point caracteristique" et de le suivre image par image, ca rejoint l'idee du projet initial : l'utilisateur choisissait sa region d'interet, puis cette region etait comparee pour chaque image de la video en utilisation la tecnhnique de cross-correlation normalisee.

    Si je reste dans cet esprit la, pensez-vous que d'autres methodes que la cross correlation peuvent etre utilisees (ex: SSD ou SAD), tout en restant efficaces pour suivre le mouvement et mesurer la vitesse ?

  11. #11
    Rédacteur
    Avatar de pseudocode
    Homme Profil pro
    Architecte système
    Inscrit en
    Décembre 2006
    Messages
    10 062
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Architecte système
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2006
    Messages : 10 062
    Points : 16 081
    Points
    16 081
    Par défaut
    Citation Envoyé par muchon Voir le message
    Si je reste dans cet esprit la, pensez-vous que d'autres methodes que la cross correlation peuvent etre utilisees (ex: SSD ou SAD), tout en restant efficaces pour suivre le mouvement et mesurer la vitesse ?
    Les methodes a base de SSD/SAD seront certainement plus rapides que la cross-correlation. Cela dit, je rejoins la remarque de Toto13 : 5 minutes pour faire un tracking simple, c'est ENNOOOORRRMMMME !

    Sinon, pour en revenir au SSD, recherche sur le net un papier qui s'appelle "SSD Tracking Using Dynamic Template". C'est très succinct mais ça présente la méthode générale de tracking par template (static et dynamic).
    ALGORITHME (n.m.): Méthode complexe de résolution d'un problème simple.

  12. #12
    Rédacteur/Modérateur

    Avatar de Jerome Briot
    Homme Profil pro
    Freelance mécatronique - Conseil, conception et formation
    Inscrit en
    Novembre 2006
    Messages
    20 302
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Freelance mécatronique - Conseil, conception et formation

    Informations forums :
    Inscription : Novembre 2006
    Messages : 20 302
    Points : 52 884
    Points
    52 884
    Par défaut
    Citation Envoyé par pseudocode Voir le message
    Cela dit, je rejoins la remarque de Toto13 : 5 minutes pour faire un tracking simple, c'est ENNOOOORRRMMMME !
    On peut essayer d'optimiser le programme MATLAB... dans une nouvelle discussion sur le forum MATLAB (en parallèle de cette discussion)
    Ingénieur indépendant en mécatronique - Conseil, conception et formation
    • Conception mécanique (Autodesk Fusion 360)
    • Impression 3D (Ultimaker)
    • Développement informatique (Python, MATLAB, C)
    • Programmation de microcontrôleur (Microchip PIC, ESP32, Raspberry Pi, Arduino…)

    « J'étais le meilleur ami que le vieux Jim avait au monde. Il fallait choisir. J'ai réfléchi un moment, puis je me suis dit : "Tant pis ! J'irai en enfer" » (Saint Huck)

Discussions similaires

  1. [Débutant] extraction d'images à partir d'une vidéo
    Par pacem dans le forum Images
    Réponses: 9
    Dernier message: 14/06/2009, 00h21
  2. extraction d'images jpeg à partir d'une vidéo
    Par crazyangelbones dans le forum Multimédia
    Réponses: 3
    Dernier message: 25/05/2007, 00h52
  3. Vitesse d'un véhicule à partir d'une vidéo
    Par amintek dans le forum Algorithmes et structures de données
    Réponses: 20
    Dernier message: 22/03/2007, 12h42
  4. capture de frame à partire d'une vidéo
    Par stripitu dans le forum C
    Réponses: 2
    Dernier message: 06/09/2006, 21h08
  5. Récupérer une image JPEG à partir d'une vidéo
    Par kurul1 dans le forum C++Builder
    Réponses: 8
    Dernier message: 09/08/2006, 10h51

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