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 :

[imagesc] Image - taille pixel -


Sujet :

MATLAB

  1. #1
    Nouveau membre du Club
    Inscrit en
    Mai 2011
    Messages
    71
    Détails du profil
    Informations forums :
    Inscription : Mai 2011
    Messages : 71
    Points : 25
    Points
    25
    Par défaut [imagesc] Image - taille pixel -
    Bonjour.
    Je débute sous MATLAB
    J'aurais 2 questions :
    En langage C par exemple , pour tracer une fonction y=x^2 par exemple , il fallait multiplier par la taille du pixel ( car en C on travaille sur les pixels ) pour pouvoir observer une figure .
    et avec MATLAB ? quand on lui demande de tracer y=x^2 ( en imagesc ) il travaille comment lui ? Directement sur les x ou sur les pixels ? Dois-je multiplier par la taille du pixel ? Autrement dit , dois-je faire
    y=x^2 ou y=taille_pixel*taille_pixel*x^2 ?

    2ème question ; j'ai par exemple dans un fchier FONC.m
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    function Z = FONC(X,Y)
    Z= X.^2 + Y.^2 
    %% d’ailleurs petite question , il faut mettre .^ ? on considère les x,y comme des tableaux ou juste des variables ? 
    end
    Dans le programme :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    z=FONC(x,y);
    imagesc(x,y,z)
    colormap(gray);
    Ca marche comme commande imagesc avec des fonctions f(x,y) ?
    voila
    merci de vos futures réponses
    cordialement
    Novae

  2. #2
    Modérateur
    Avatar de le fab
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2005
    Messages
    1 882
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2005
    Messages : 1 882
    Points : 3 432
    Points
    3 432
    Par défaut
    pour les pixel, j'en ai aucune idée
    par contre .^ rend ta fonction plus flexible, lui permettant de travailler sur des vecteur et/ou des matrices
    si tu ne met pas le point, tu devra utiliser une boucle for (ou une fonction du type arrayfun) pour calculer FONC pour toutes les valeurs de X et Y

  3. #3
    FLB
    FLB est déconnecté
    Modérateur
    Avatar de FLB
    Homme Profil pro
    Ing. Aérospatiale
    Inscrit en
    Juin 2003
    Messages
    770
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Ing. Aérospatiale
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Juin 2003
    Messages : 770
    Points : 1 185
    Points
    1 185
    Par défaut
    Salut,
    imagesc n'utilise pas de notion de pixel d'écran, regarde ce que fait ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    figure;imagesc(rand(10,10));
    figure;imagesc(rand(100,100));
    Tu peux gérer la résolution avec axis.

    Ton utilisation des fonctions est bonne, mais je ne vois pas ce que tu veux dire avec
    Ca marche comme commande imagesc avec des fonctions f(x,y) ?

  4. #4
    Nouveau membre du Club
    Inscrit en
    Mai 2011
    Messages
    71
    Détails du profil
    Informations forums :
    Inscription : Mai 2011
    Messages : 71
    Points : 25
    Points
    25
    Par défaut
    Merci à vous deux.
    En fait , dans TOUS les exemples que j'ai vu , imagesc c'est pour afficher des images qu'on charge par exemple. elles sont déjà existantes et quand on a des fonctions mathématiques , tous les exemples nous donnent des "plot". Ce que je veux faire en fait c'est un genre de DensityPlot comme sur mathematica en niveau de gris


    J'ai écris dans le fichier fonc.m ( pas faire attention à a et b , j'ai mis ca pour l'exemple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Intensité = a*X.^2 + b*Y.^2
    dans le programme principale
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    x=-1:0.1:1;
    y=-1:0.1:1;
    In= fonc(x,y)
    imagesc(x,y,In)
    Bon j'ai quelque chose en sortie mais c'est pas du tout çà mais au moins ça bug pas ^^

  5. #5
    Modérateur
    Avatar de le fab
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2005
    Messages
    1 882
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2005
    Messages : 1 882
    Points : 3 432
    Points
    3 432
    Par défaut
    Citation Envoyé par Novae Voir le message
    Ce que je veux faire en fait c'est un genre de DensityPlot comme sur mathematica en niveau de gris
    dans ce cas regarde plutôt du coté de fonctions comme pcolor peut etre
    (et colormap)

  6. #6
    Nouveau membre du Club
    Inscrit en
    Mai 2011
    Messages
    71
    Détails du profil
    Informations forums :
    Inscription : Mai 2011
    Messages : 71
    Points : 25
    Points
    25
    Par défaut
    rha il me met Color data input must be a matrix .

    Pourtant X et Y sont des vecteurs. L'intensité que je calcule est forcement une matrice non ?

  7. #7
    Modérateur
    Avatar de le fab
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2005
    Messages
    1 882
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2005
    Messages : 1 882
    Points : 3 432
    Points
    3 432
    Par défaut
    si tu as écris :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    x=-1:0.1:1;
    y=-1:0.1:1;
    In= fonc(x,y)
    pcolor(x,y,In)
    In n'est probablement pas une matrice !
    va voir du coté de

  8. #8
    FLB
    FLB est déconnecté
    Modérateur
    Avatar de FLB
    Homme Profil pro
    Ing. Aérospatiale
    Inscrit en
    Juin 2003
    Messages
    770
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Ing. Aérospatiale
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Juin 2003
    Messages : 770
    Points : 1 185
    Points
    1 185
    Par défaut
    Le problème est dans ton calcul de Z : si x et y sont des vecteurs de taille n et m, il faut que Z soit de taille n*m.
    Le plus simple est de passer par meshgrid :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    x = -10:10;
    y = -1:0.1:1;
    [xx,yy] = meshgrid(x,y);
    pcolor(x,y,sin(xx).*sin(yy));
    colormap('gray');

  9. #9
    Nouveau membre du Club
    Inscrit en
    Mai 2011
    Messages
    71
    Détails du profil
    Informations forums :
    Inscription : Mai 2011
    Messages : 71
    Points : 25
    Points
    25
    Par défaut
    Merci , j'ai fais meshgrid.
    En fait je crois comprendre ce qu'il ne va pas( mais j'arrive pas à la résoudre )
    c'est dans ma fonction mathématique ;
    en gros :
    j'ai une fonction R qui dépend de x et y
    size(R) = 201 201

    Une fonction O qui dépend de x et y
    size(O) = 201 201

    et la le problème : J'ai une fonction Somme qui fait une somme discrète de fonction de x et y , genre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    indice = 1:10
    Somme = sum(A(indice).*X.^2 + B(indice).*Y.^2
    et la size(Somme) = 1 201
    le problème c'est que le multiplie O par Somme donc ça va pas au niveau des dimensions

    EDIT : Bon apparemment la fonction sum fait le produit scalaire du tableau A(indice) par X donc ça foire tout. J'ai utilisé la boucle for et les dimensions sont correctes.

    Waou c'est dur la manipulation vecteurs/matrices sous matlab !

  10. #10
    FLB
    FLB est déconnecté
    Modérateur
    Avatar de FLB
    Homme Profil pro
    Ing. Aérospatiale
    Inscrit en
    Juin 2003
    Messages
    770
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Ing. Aérospatiale
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Juin 2003
    Messages : 770
    Points : 1 185
    Points
    1 185
    Par défaut
    Citation Envoyé par Novae Voir le message
    J'ai utilisé la boucle for et les dimensions sont correctes.
    La grande majorité des opérations peuvent se faire sous la forme vectorielle, matlab n'est pas fait pour traiter les boucles rapidement. Montre nous ta boucle si tu veux qu'on jette un coup d'oeil pour vectoriser l'opération.
    Citation Envoyé par Novae Voir le message
    Waou c'est dur la manipulation vecteurs/matrices sous matlab !
    C'est vrai, on met un peu de temps à s'y faire, mais ça devient un outil puissant une fois maitrisé .

  11. #11
    Nouveau membre du Club
    Inscrit en
    Mai 2011
    Messages
    71
    Détails du profil
    Informations forums :
    Inscription : Mai 2011
    Messages : 71
    Points : 25
    Points
    25
    Par défaut
    ahhh ca marche !
    Bon je met la boucle for :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
     
    for indice = 1:10
    SOMME=SOMME + a(indice).*K2xeq(indice).*K2yeq(indice).*(Nxeq(indice).*X.^2+Nyeq(indice).*Y.^2)).*(Mxeq(indice).*X.^2+ Myeq(indice).*Y.^2));
    end
    Il manque peut être des parenthèses , la formule est plus longue mais ce sont des constantes donc je l'ai ai supprimées sur le forum , j'ai peut être oublié des parenthèses.


    Pour trouver mon erreur j'avais fais un petit test dans la console :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    A=[1 2 3 4];
    indice=1:4;
    Somme = sum(A(indice).*A)
    Somme=30 ( résultat )
    Donc il me donne un scalaire alors que je voulais un vecteur , c'est pour ça que j'ai utilisé for. Sum fait le produit scalaire non ?

    De plus je pense que A(indice) était un scalaire ( car A(1) =1 ) mais A(indice)*A erreur de dimension.

  12. #12
    Modérateur
    Avatar de le fab
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2005
    Messages
    1 882
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2005
    Messages : 1 882
    Points : 3 432
    Points
    3 432
    Par défaut
    non, sum fait la somme de tous les éléments de ton vecteurs ou de tous les éléments de chaque colonnes d'une matrice (dans ce cas le retour est un vecteur)
    A(indice) est une matrice :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    A(indice)
     
    ans =
     
         1     2     3     4
    en fait cette technique permet de trier/filtrer une matrice/un vecteur
    pour avoir un scalaire il faut que indice soit aussi un scalaire

    edit :
    peut être voulais tu utiliser cumsum ??

  13. #13
    Nouveau membre du Club
    Inscrit en
    Mai 2011
    Messages
    71
    Détails du profil
    Informations forums :
    Inscription : Mai 2011
    Messages : 71
    Points : 25
    Points
    25
    Par défaut
    Arf avec la commande pcolor , c'est pas trop la même chose que densityplot , y'a comme une espèce de quadrillage

  14. #14
    Modérateur
    Avatar de le fab
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2005
    Messages
    1 882
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2005
    Messages : 1 882
    Points : 3 432
    Points
    3 432
    Par défaut
    ajoutes la ligne
    ou
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    set(h, 'LineStyle', 'none');
    après avoir écrit

  15. #15
    Nouveau membre du Club
    Inscrit en
    Mai 2011
    Messages
    71
    Détails du profil
    Informations forums :
    Inscription : Mai 2011
    Messages : 71
    Points : 25
    Points
    25
    Par défaut
    Ahhhh merci lefab c'est beaucoup mieux !

    J'ai regardé un peu cumsum , je vais tester ça !
    merci

    EDIT : Ah ouai , cumsum ça donne pareil , niquel
    Merci beaucoup

  16. #16
    Nouveau membre du Club
    Inscrit en
    Mai 2011
    Messages
    71
    Détails du profil
    Informations forums :
    Inscription : Mai 2011
    Messages : 71
    Points : 25
    Points
    25
    Par défaut
    J'aurais 2 petites question svp
    Une fois ma figure faite ( grâce a pcolor ) , les commandes imagesc,imread etc ne servent à rien non ? ces commandes sont utilisées quand on a des images extérieures non ?

    Aussi , j'ai ma belle figure et je voudrais la trasnformée un peu ( les niveaux de gris ) :
    J'ai :
    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
     
    figure(1);
    h=pcolor(X,Y,I);
    set(h, 'LineStyle', 'none');
    xlabel('x(m)');
    ylabel('y(m)');
    colormap(gray);
     
     
    figure(2);
    size(I);
    I(200,200)=0;
    hh=pcolor(X,Y,I);
    set(hh, 'LineStyle', 'none');
    xlabel('salut');
    ylabel('salut');
    colormap(gray);
    Je veux imposer une certaine intensité sur les bords de l'image par exemple
    I(100:200,100:200)=0;
    Mais cela ne fait rien , il ne me trace pas la 2eme figure enfin c'est tout blanc mais pas de message d'erreur. Je me demandais si on pouvait transformer directement comme ca ?
    merci

  17. #17
    FLB
    FLB est déconnecté
    Modérateur
    Avatar de FLB
    Homme Profil pro
    Ing. Aérospatiale
    Inscrit en
    Juin 2003
    Messages
    770
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Ing. Aérospatiale
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Juin 2003
    Messages : 770
    Points : 1 185
    Points
    1 185
    Par défaut
    Salut,
    Si tu souhaites ajouter un bord noir :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    figure(2);
    [Im, In] = size(I);
    noir = min(I);%pour du blanc : max
    I(:,1)=noir;
    I(1,:)=noir;
    I(:,Im)=noir;
    I(In,:)=noir;
    hh=pcolor(X,Y,I);
    imread sert à lire des fichiers images, imagesc à afficher un tableau contenant des données de couleurs.

  18. #18
    Nouveau membre du Club
    Inscrit en
    Mai 2011
    Messages
    71
    Détails du profil
    Informations forums :
    Inscription : Mai 2011
    Messages : 71
    Points : 25
    Points
    25
    Par défaut
    Merci de ta réponse. En fait par bord noir je me suis mal exprimé je voulais plutôt dire ajuster la largeur de ma fonction. Car par exemple en fait mon intensité c'est des interférences lumineuses dons des sinusoïdes qui prennent toute la figure ( normale il y a une intensité pour chaque valeur de X et Y ) en fait ce que je veux faire c'est rétrécir un peu la figure d’interférence , qu'elle soit juste au centre et qu'on voit juste quelque sinusoïdes. C'est un peu comme si on ajustant la largeur a mi hauteur d'une gaussienne. Je voudrais avoir mes sinusoïdes et sur le reste de la figure du gris

    Je vais m’inspirer de ton code. Au départ , j'avais tenté une condition if genre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    if (X<200) 
        I=0 
    else 
        I= f(x,y)
    Mais apparemment il aime pas trop le if (X<200) car X est un vecteur

  19. #19
    Modérateur
    Avatar de le fab
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2005
    Messages
    1 882
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2005
    Messages : 1 882
    Points : 3 432
    Points
    3 432
    Par défaut
    met NaN au lieu de 0
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    I(100:200,100:200)=NaN;
    sinon tu fais quelque chose comme :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    pcolor(X(100:200),Y(100:200),I(100:200,100:200))
    ou
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    pcolor(X(100:200,100:200),Y(100:200,100:200),I(100:200,100:200))
    en fonction de comment tu as écrit X et Y

  20. #20
    Nouveau membre du Club
    Inscrit en
    Mai 2011
    Messages
    71
    Détails du profil
    Informations forums :
    Inscription : Mai 2011
    Messages : 71
    Points : 25
    Points
    25
    Par défaut
    Merci
    Mais alors le pcolor , il va juste tracer pour l'intervalle de X voulu et l'intensité correspondante. Il ne va pas tracer la vrai fonction pour les autre X
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    pcolor(X(100:200),Y(100:200),I(100:200,100:200))
    En fait je pense qu'on se complique non ? matlab doit avoir avoir un moyen de faire par exemple :

    I = sin(x+y) SI X ∈ [100;200] et Y ∈[100;200] 
      = 10 ( chiffre au hasard ) sinon

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Taille image en pixel
    Par cedd70 dans le forum C
    Réponses: 2
    Dernier message: 19/06/2015, 14h02
  2. Rapport taille pixels / taille points
    Par Sylario dans le forum Interfaces Graphiques en Java
    Réponses: 1
    Dernier message: 17/03/2006, 19h35
  3. [Image] Taille d'une photo
    Par leloup84 dans le forum Bibliothèques et frameworks
    Réponses: 8
    Dernier message: 07/03/2006, 11h31
  4. image.Canvas.Pixels[x,y]
    Par Invité dans le forum Langage
    Réponses: 3
    Dernier message: 20/02/2006, 09h51
  5. Modifier une image par pixels
    Par mateo.14 dans le forum MFC
    Réponses: 10
    Dernier message: 21/01/2005, 15h09

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