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 :

Image en paramètre à une fonction C [Débutant]


Sujet :

Images

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Étudiant
    Inscrit en
    Octobre 2007
    Messages
    25
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2007
    Messages : 25
    Par défaut Image en paramètre à une fonction C
    Bonjour,

    Je désire effectuer des changements sur les pixels d'une image.
    Pour ce que je veux faire, Matlab est un peu lent, une partie de mon
    programme est donc en C.

    D'abord je charge mon image avec "imread", ensuite je donne la matrice
    obtenue en paramètre à ma fonction en C.

    Du côté de ma fonction en C, je me retrouve avec un vecteur contenant
    d'abord les valeurs de rouge de tous les pixels de mon image, ensuite les
    valeurs de vert, puis les valeurs de bleu. Jusque là, rien d'anormal.
    Mais je me suis aperçue que chacune de ces valeurs étaient encodées sur
    4octets (contre 1octet à l'habitude).

    Concrètement, en admettant que je veuille transformer le haut gauche de mon
    image en un simple carré rouge. Je parcours mon vecteur avec les bornes qui
    vont biens, pour la valeur de rouge je mets le maximum (à savoir 0xFFFFFFFF) et pour les autres je mets 0.
    J'obtiens bien un carré rouge, mais là où cela devient surprenant c'est si au
    lieu de 0xFFFFFFFF, je mets une valeur du genre 0xfbf9faf0, je me retrouves
    avec des traits horizontaux dans mon carré, au lieu d'un rouge uni différent du précédent.

    Ma question est donc, à quoi correspond ce nombre ?
    Visiblement, il n'y a aucun lien avec la valeur 255 (qui est utilisée la
    plupart du temps).
    Les traits horizontaux n'ont pas l'air d'être "en random", il doit donc
    y avoir une logique derière tout cela, mais laquelle ?

    Merci pour votre aide !

    --
    pootchi

  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 317
    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 317
    Par défaut
    Citation Envoyé par pootchi Voir le message
    Pour ce que je veux faire, Matlab est un peu lent
    Est-il possible d'en savoir un peu plus sur ce point ?
    Peux-tu nous dire ce que tu cherches à faire et si tu as déjà cherché à optimiser ton code ?

  3. #3
    Membre averti
    Étudiant
    Inscrit en
    Octobre 2007
    Messages
    25
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2007
    Messages : 25
    Par défaut
    Citation Envoyé par Dut Voir le message
    Est-il possible d'en savoir un peu plus sur ce point ?
    Peux-tu nous dire ce que tu cherches à faire et si tu as déjà cherché à optimiser ton code ?
    En gros, je voudrais parcourir ma matrice pour changer certaines valeurs.
    Mais pour cela, il faut que je connaisse les coordonnées, je n'ai pas vu
    d'autre moyen que de faire deux boules "for" imbriquées. Ce qui ralenti MatLab.

    J'ai tenté une première optimisation, du genre :
    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
     
    % premiere version
    t=[0:1:200];
    n=100;
    m=size(t,2);
    for i=1:m
      for j=1:n+1
        A(i,j)=t(i)^(j-1);
      end
    end;
     
    % version matricielle optimisée
    t=[0:1:200];
    n=100;
    m=size(t,2);
    A=ones(m,n+1);
    for i=1:n
      A(:,i+1)=A(:,i).*t';
    end;
    Mais je dois tester la valeur de mes coordonnées, pour savoir
    si c'est un pixel à changer ou non. Donc, aec la deuxième version,
    ce n'est pas possible.

    précision : je débute en Matlab

    --
    pootchi

  4. #4
    Rédacteur/Modérateur

    Avatar de Jerome Briot
    Homme Profil pro
    Freelance mécatronique - Conseil, conception et formation
    Inscrit en
    Novembre 2006
    Messages
    20 317
    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 317
    Par défaut
    Citation Envoyé par pootchi Voir le message
    Mais je dois tester la valeur de mes coordonnées, pour savoir si c'est un pixel à changer ou non.
    C'est justement ce test qui m'intéresse... que cherches-tu à tester sur la valeur de tes pixels ?

    D'ailleurs tu travailles bien sur une image RGB ?

  5. #5
    Membre averti
    Étudiant
    Inscrit en
    Octobre 2007
    Messages
    25
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2007
    Messages : 25
    Par défaut
    Citation Envoyé par Dut Voir le message
    C'est justement ce test qui m'intéresse... que cherches-tu à tester sur la valeur de tes pixels ?

    D'ailleurs tu travailles bien sur une image RGB ?
    oui, je travaille en RGB.

    J'ai découpé mon image en plusieurs triangles. Ensuite, pour chaque
    triangle, je change la valeur des pixels qu'il contient.
    Le parcours avec deux boucles "for" ne permet que de travailler
    sur un rectangle.
    Donc mon test est de savoir si mes cordonées (i,j) appartiennent
    au triangle sur lequel je suis en train de travailler.

    --
    pootchi

  6. #6
    Rédacteur/Modérateur

    Avatar de Jerome Briot
    Homme Profil pro
    Freelance mécatronique - Conseil, conception et formation
    Inscrit en
    Novembre 2006
    Messages
    20 317
    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 317
    Par défaut
    Voici un exemple qui permet de déterminer les pixels compris dans un triangle aléatoire sur une image RGB :

    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
    % Chargement d'une image RGB
    rgb = imread('ngc6543a.jpg');
     
    % Ouverture d'un objet Figure
    figure
     
    % Affichage de l'image originale
    subplot(2,1,1)
    image(rgb)
    % Réglage de l'affichage au dimension de l'image
    axis image
     
    % Génération d'un triangle aléatoire
    [r,c]=size(rgb(:,:,1));
    x=round(rand(1,3)*r);
    y=round(rand(1,3)*c);
     
    % Paramètrage de l'objet Axes pour pouvoir superposer le triangle sur
    % l'image
    hold on
     
    % Tracé du triangle en vert sur l'image RGB
    plot([x x(1)],[y y(1)],'g-');
     
    % Génération de tous les couples des indices des pixels
    [xpix,ypix]=meshgrid(1:c,1:r);
     
    % Recherche des indices des pixels contenus dans le triangle
    in=inpolygon(xpix,ypix,x(:),y(:));
     
    % Modification des pixels correspondant <= PARTIE A ADAPTER
    in=uint8(in);
    rgb(:,:,1)=rgb(:,:,1).*uint8(in);
    rgb(:,:,2)=rgb(:,:,2).*uint8(in);
    rgb(:,:,3)=rgb(:,:,3).*uint8(in);
     
    % Affichage des pixels modifiés
    subplot(2,1,2)
    image(rgb)
    axis image
    Le plus important ici est la génération des indices "in".
    Il faut ensuite adapter le code pour effectuer les opérations voulues sur ces pixels.

    Voir également la à propos des différentes méthodes d'indexage sous MATLAB.

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

Discussions similaires

  1. Passage d'une image en paramètre de fonction
    Par hadiya dans le forum C++Builder
    Réponses: 1
    Dernier message: 31/03/2014, 18h12
  2. Passage de paramètre à une fonction dans un G_CALLBACK
    Par Dimitri_87 dans le forum GTK+ avec C & C++
    Réponses: 5
    Dernier message: 15/09/2006, 12h04
  3. [PL/SQL] : Passage de paramètres à une fonction
    Par dcollart dans le forum Oracle
    Réponses: 5
    Dernier message: 13/07/2006, 11h17
  4. [VBA] Envoyer un listBox en paramètre à une fonction
    Par kissmytoe dans le forum Access
    Réponses: 8
    Dernier message: 13/03/2006, 21h28
  5. lire une image et tracer une fonction
    Par Battosaiii dans le forum C
    Réponses: 4
    Dernier message: 23/11/2005, 16h21

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