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 :

Cropper une image


Sujet :

Images

  1. #1
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2014
    Messages
    21
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Santé

    Informations forums :
    Inscription : Novembre 2014
    Messages : 21
    Points : 13
    Points
    13
    Par défaut Cropper une image
    Bonjour,

    Une question très simple, je voudrais récupérer mon rectangle et l'afficher dans une autre figure. Mais ça marche pas ><

    Code MATLAB : 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
     
    clc
    clear all
    close all
     
    obj = VideoReader('MaVid.avi');
     
    figure(1);
    I = imshow(read(obj,1)); % display first frame
    i = imrect; % generate rectangle
    wait(i); % wait for rectangle
     
     
    i = i.getPosition; % get coordinates of the rectangle
    i = i./2;
    i2=imcrop(I,i); % crop I around the coordinates of the rectangle
    figure(2);
    i3 = imshow(i2);

    Merci pour votre aide !

  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
    Que souhaites-tu faire avec cette ligne :
    Selon la documentation :
    getPosition — Return current position of rectangle

    pos = getPosition(h) returns the current position of the rectangle h. The returned position, pos, is a 1-by-4 array [xmin ymin width height].
    Ou xmin,ymin est le coin en haut à gauche, quel est le but de cette division par2?
    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 à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2014
    Messages
    21
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Santé

    Informations forums :
    Inscription : Novembre 2014
    Messages : 21
    Points : 13
    Points
    13
    Par défaut
    Bonsoir magelan,

    Merci pour ta réponse.

    Finalement j'ai changé de méthode et obtenu un résultat. Problème, mon image originale est en uint8 et en RGB, et l'image que j'obtiens par cette méthode est en nuance de gis ! J'ai simplement enregistré les coordonnées du rectangle sur l'image originale, puis manipulé ces éléments pour extraire la partie de l'image qui m'intéressait.

    Code MATLAB : 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
     
    clc
    close all
    clear all
     
    video = VideoReader('SWE_Tendon.avi');
     
    % rPos = [518 172 484 145];
    % pos = getPosition(h) returns the current position of the rectangle h. The returned position, pos, is a 1-by-4 array [xmin ymin width height].
    % height is the number of rows
    % width number of columns
     
    I=read(video,1);
     
    i = I(172:172+145,518:518+484);
     
    % Question de curiosité : i = I(ordonnées,abscisses); ???
     
    imshow(i);
    axis on;

    Y a t-il moyen de garder les couleurs ?

    Egalement, si tu sais quelque chose à propos de la question de curiosité...

    Merci pour ton aide !

  4. #4
    Invité
    Invité(e)
    Par défaut
    Bonsoir,

    Une image en couleurs est représentée par un tableau MxNx3 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    i = I(172:172+145,518:518+484,:);
    Pour les ordonnées/abscisses, c'est bien cela : pour I(i,j,k) :
    • i parcours la hauteur de l'image, selon les ordonnées y en descendant ;
    • j parcours la largeur de l'image, selon les abscisses x.
    • k parcours les canaux r, g, b de l'image.
    Images attachées Images attachées  

  5. #5
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2014
    Messages
    21
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Santé

    Informations forums :
    Inscription : Novembre 2014
    Messages : 21
    Points : 13
    Points
    13
    Par défaut
    Bonsoir Winjerome,

    Ce soir tu m'as rendu heureux !

  6. #6
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2014
    Messages
    21
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Santé

    Informations forums :
    Inscription : Novembre 2014
    Messages : 21
    Points : 13
    Points
    13
    Par défaut
    Bonsoir,

    Je me permets de rebondir sur le topic, puisque le titre correspond toujours.

    Désormais, je voudrais créer une fonction loop pour différencier mon petit carré sur toutes les frames de la vidéo, et n'extraire que ceux qui m'intéressent. A cause des oscillations/interférences, les frames que je veux récupérer doivent avoir une valeur de différence supérieure à 100.

    Mais mon problème se situe simplement dans l'écriture de la boucle, j'obtiens l'erreur Subscripted assignment dimension mismatch.

    J'ai regardé la FAQ, sans toutefois comprendre l'origine de l'erreur...

    Code MATLAB : 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
     
    clc
    close all
    clear all
     
    video = VideoReader('MaVid.avi');
     
    NbF = video.NumberOfFrames;
    vidHeight = video.Height;
    vidWidth = video.Width;
     
    I=imshow(read(video,1));
    h =imrect;
    wait(h);
    h = h.getPosition;
     
    J(1:NbF) =struct('cdata', zeros(vidHeight, vidWidth, 3, 'uint8'),'colormap', colormap('gray') );
     
    for k=1 : NbF
     
        J(k).cdata = read(video,k);
        I = J(k).cdata;
        i(k) = imcrop(I,h);
     
        if max(i(k+1)-i(k))>100
            imwrite(i(k),'Frames.png');
        end
    end

    Merci pour votre aide !

  7. #7
    Invité
    Invité(e)
    Par défaut
    Ton erreur sur la ligne i(k) = imcrop(I,h); vient du fait que i(k) ne représente qu'une seule valeur alors que imcrop(I,h) retourne une sous-image de I, en contenant bien plus qu'une.

    Une fois ceci corrigé, je te conseille (modulo l'écriture i(k) / i(k+1) rectifiée) de regarder ce que retourne max(i(k+1)-i(k))

  8. #8
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2014
    Messages
    21
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Santé

    Informations forums :
    Inscription : Novembre 2014
    Messages : 21
    Points : 13
    Points
    13
    Par défaut
    Bonsoir Winjerome,

    J'ai modifié mon code en conséquence, mais tu avais raison sur le dernier point, maintenant il m'affiche "Index exceeds matrix dimensions" pour la ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if max(i(k+1).cdata-i(k).cdata)>100
    . L'idée est en réalité de différencier les frames quasi-identiques de la vidéo avec les frames vraiment différentes, puis de conserver les frames vraiment différentes. Pour ça, j'ai lu puis croppé mes frames d'intérêt, et la soustraction entre chacune d'entre elles m'a permis de déterminer manuellement une valeur threshold de 100.
    La commande max(A) est censé permettre de reconnaître la valeur maximum de la différence...

    Code MATLAB : 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
     
    clc
    close all
    clear all
     
    video = VideoReader('MaVid.avi');
     
    NbF = video.NumberOfFrames;
    vidHeight = video.Height;
    vidWidth = video.Width;
     
    I=read(video,1);
     
    J(1:NbF) =struct('cdata', zeros(vidHeight, vidWidth, 3, 'uint8'),'colormap', colormap('gray') );
    i(1:NbF) =struct('cdata', zeros(146, 485, 3, 'uint8'));
     
     
    for k=1 : NbF
     
        J(k).cdata = read(video,k);
        I = J(k).cdata;
        i(k).cdata = imcrop(I,[518 172 484 145]);
     
        if max(i(k+1).cdata-i(k).cdata)>100
            imwrite(i(k),'Frames.png');
        end
    end

    Merci encore !

  9. #9
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2014
    Messages
    21
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Santé

    Informations forums :
    Inscription : Novembre 2014
    Messages : 21
    Points : 13
    Points
    13
    Par défaut
    Re-bonsoir !

    J'ai revu le scritpt et corrigé deux-trois choses.

    J'avais une erreur à cause du nombre final (NbF). En effet, sur la dernière boucle, k+1 ne peut pas s'afficher. J'ai donc remplacé par NbF - 1.

    Mais je n'arrive toujours pas à écrire mes images

    Code MATLAB : 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
     
    clc
    close all
    clear all
     
    video = VideoReader('MaVid.avi');
     
    NbF = video.NumberOfFrames;
    vidHeight = video.Height;
    vidWidth = video.Width;
     
     
    J(1:NbF) =struct('cdata', zeros(vidHeight, vidWidth, 3, 'uint8'));
    i(1:NbF) =struct('cdata', zeros(146, 485, 3, 'uint8'));
     
     
    for k=1 : NbF-1
     
        J(k).cdata = read(video,k);
        L = J(k).cdata;
        i(k).cdata = imcrop(L,[518 172 484 145]);
     
        M = i(k+1).cdata-i(k).cdata;
     
        %if max(squeeze(i(k+1).cdata)-squeeze(i(k).cdata))>100
        if max(M(:))>100
            imwrite(i(k+1),' '+(k+1)+' Frames.png');
        end
    end

  10. #10
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2014
    Messages
    21
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Santé

    Informations forums :
    Inscription : Novembre 2014
    Messages : 21
    Points : 13
    Points
    13
    Par défaut
    Re-re-bonsoir

    Ca y est.

    Je poste le script pour ceux qui sont intéressés (et je mets en résolu par la même occasion).

    Code MATLAB : 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
     
    clc
    close all
    clear all
     
    video = VideoReader('MaVid.avi');
     
    NbF = video.NumberOfFrames;
    vidHeight = video.Height;
    vidWidth = video.Width;
     
     
    J(1:NbF) =struct('cdata', zeros(vidHeight, vidWidth, 3, 'uint8'));
    i(1:NbF) =struct('cdata', zeros(146, 485, 3, 'uint8'));
     
    % 
    % initialisation de la premiere valeur
    % 
     
        J(1).cdata = read(video,1);
        L = J(1).cdata;
        i(1).cdata = imcrop(L,[518 172 484 145]);
    %
    % boucle sur les images de la frame a partir de 2
    %
    for k=2 : NbF-1
     
     
     
        J(k).cdata = read(video,k);
        L = J(k).cdata;
        i(k).cdata = imcrop(L,[518 172 484 145]);
     
        M = i(k).cdata-i(k-1).cdata;
     
        if max(M(:))>80
            imwrite(i(k).cdata,[' ' num2str(k) 'Frames.png']);
        end
    end

    Merci à vous tous !

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

Discussions similaires

  1. Resize d'une image
    Par Anonymous dans le forum C
    Réponses: 6
    Dernier message: 13/07/2008, 22h23
  2. Lecture d'une image bitmap
    Par Geronimo dans le forum x86 32-bits / 64-bits
    Réponses: 18
    Dernier message: 28/06/2002, 12h01
  3. Réponses: 3
    Dernier message: 12/06/2002, 19h03
  4. lire une image au format RAW
    Par Anonymous dans le forum OpenGL
    Réponses: 5
    Dernier message: 20/05/2002, 00h11
  5. faire un selection dans une image aves les APIs
    Par merahyazid dans le forum C++Builder
    Réponses: 3
    Dernier message: 30/04/2002, 10h44

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