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

C++ Discussion :

traitement des images


Sujet :

C++

  1. #1
    Membre régulier
    Femme Profil pro
    Étudiant
    Inscrit en
    Février 2015
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 35
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2015
    Messages : 9
    Par défaut traitement des images
    Bonjour à vous tous
    Je veux savoir comment je peut créer un graphe à partir d'une image en c++?? comme le montre la figure suivante, où chaque noeud contient un pixel de l'image.
    Nom : image.png
Affichages : 161
Taille : 9,6 Ko

  2. #2
    Expert éminent

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 202
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 202
    Par défaut
    D'après toi?

    Je vois deux parties au problème, lire l'image et créer le graphe.

    Comme ton graphe est un maillage, tu peux utiliser une matrice contenant les poids des aretes, de la taille qui convient (lis à ce sujet les deux entrées sur les matrices de la faq C++)

  3. #3
    Membre régulier
    Femme Profil pro
    Étudiant
    Inscrit en
    Février 2015
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 35
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2015
    Messages : 9
    Par défaut
    ui j'ai déjà passé l'étape de la lecture d'image. Ce qui me bloque c'est la modélisation de la classe graph

  4. #4
    Expert confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 466
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Val de Marne (Île de France)

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

    Informations forums :
    Inscription : Février 2005
    Messages : 5 466
    Par défaut
    Pas besoin d'un graphe, c'est juste une matrice avec soit 2 fois plus de ligne, soit 2 fois plus de colonnes.
    Vous pouvez aussi générer 2 matrices de la même taille que l'image, l'un avec le delta horizontal, l'autre avec le delta vertical.

  5. #5
    Membre régulier
    Femme Profil pro
    Étudiant
    Inscrit en
    Février 2015
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 35
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2015
    Messages : 9
    Par défaut
    vous ne m'avez pas compris
    je suis entrain d'implémenter un algorithme de segmentation des images par la méthode ligne de partage d'eau qui est basé sur les graphes. Donc j'aurai besoin de ce passage là.

  6. #6
    Expert éminent

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 202
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 202
    Par défaut
    La conception de ton graphe devrait être simple, mais répondre à un besoin

    Tu va forcément avoir une classe graphe, qui te propose les services dont tu auras besoin.
    Quelle serait son interface publique?

    Partant de la, tu as deux grandes sortes de solutions:
    • Avec deux classes noeud et aretes,
    • Avec une seule de ces deux classes, parce qu'une seule composante n'a d'utilité pour l'utilisateur. (généralement le noeud)


    je te suggérais un tableau 2D (ou une version linéarisée, c'est pareil)

  7. #7
    Membre régulier
    Femme Profil pro
    Étudiant
    Inscrit en
    Février 2015
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 35
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2015
    Messages : 9
    Par défaut
    Ui c'est bon, j'ai déjà crée les deux classes "arete" et "Noeud".
    Et j'ai implémenté le code suivant dans la classe "Graphe":
    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
    #include "stdafx.h"
    #include "Edge.h"
    #include "Vertex.h"
    #include "MyImage.h"
    #include "Graph.h"
    #include <vector>
     
    using namespace std;
     
    Graph::Graph()
    {
     
    }
     
    Graph::~Graph()
    {
     
    }
     
    //m[][] = new imagepixels();
     
     
     
    //créer des vertex a partir de la matrice
     
     std::vector<Vertex> Graph::noeud(BYTE** M)
    {
    	std::vector<Vertex>liste1;
     
    	for (int i = 0; i < M.Height; i++)
    	{
    		for (int j = 0; j < M.Width; j++)
    		{
    			Vertex v;
    			v.set_id = M[i][j];
    			liste1.push_back(v);
    		}
    	}
    	return liste1;
    }
     
    //creer des edges a partir de la liste des vertex precedente
     
    std::vector<Edge> Graph::edges()
    {
    	std::vector<Vertex> liste2 = noeud();
    	std::vector<Edge> listedge;
     
    	for (int i = 0; i < (liste2.max_size())-1; i++)
    	{
    		Edge e;
    		Vertex v1 = liste2[i];
    		Vertex v2 = liste2[i+1];
    		int weight = abs(v1.get_id - v2.get_id);
    		e.set_eVertP = v1;
    		e.set_sVertP = v2;
    		e.set_weight = weight;
    		listedge.push_back(e);
    	}
     
    	return listedge;
     
    }
    Mon problème comment je crée la matrice de pixels de mon image?

  8. #8
    Expert éminent

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 202
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 202
    Par défaut
    Tu l'as, vu que tu dis avoir lu l'image

  9. #9
    Membre régulier
    Femme Profil pro
    Étudiant
    Inscrit en
    Février 2015
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 35
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2015
    Messages : 9
    Par défaut
    J'ai trouvé un code tout pret de la classe MyImage.
    Mais je ne trouve pas le moyen, comment à partir de l'image je peux extraire la matrice qui contient les pixels de l'image. J'arrive pas à comprendre le code :/
    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
    #include "StdAfx.h"
    #include "MyImage.h"
     
     
     
    MyImage::MyImage(WCHAR* FileName) : Gdiplus::Bitmap((WCHAR*)FileName, FALSE)
    {
    	unsigned i;
    	BitmapData* BmpData;
    	BYTE* PixPtr;
     
    	// Initialisation du nom du fichier
    	this->FileName = new WCHAR[wcslen(FileName) + 1];
    	wcscpy(this->FileName, FileName);
     
    	// Initialisation des dimensions et du format des pixels
    	this->Height = this->GetHeight();
    	this->Width = this->GetWidth();
    	this->PixFormat = this->GetPixelFormat();
     
     
    	// Allocation de l'espace pour la matrice qui contiendra les infos sur les pixels
    	Pixels = new BYTE*[Height];
    	for (i = 0; i<Height; i++)
    		Pixels[i] = new BYTE[Width];
     
    	// Préparation de l'extraction des informations
    	Rect rc(0, 0, Width, Height);
    	BmpData = new BitmapData();
    	this->LockBits(&rc, ImageLockModeRead, this->PixFormat, BmpData);
     
    	// Initialisation de la matrice Pixels
    	if (BmpData)
    	{
    		this->ScanWidth = abs(BmpData->Stride);
    		// MAJ des valeurs des pixels ligne par ligne
    		PixPtr = (BYTE*)BmpData->Scan0;
    		for (i = 0; i<Height; i++)
    			CopyMemory(this->Pixels[i], PixPtr + (i*this->ScanWidth), this->Width);
    	}
    	this->UnlockBits(BmpData);
    	delete BmpData;
     
    }
     
     
     
    MyImage::~MyImage()
    {
    	// Libération de l'espace utilisé par la chaîne FileName
    	if (this->FileName)
    		delete this->FileName;
     
    	// Libération de l'espace utilisé par la matrice Pixels
    	unsigned i;
    	if (Pixels != NULL)
    	{
    		for (i = 0; i<Height; i++)
    			delete[] Pixels[i];
    		delete[] Pixels;
    	}
    	Pixels = NULL;
    	Height = Width = ScanWidth = 0;
    }
     
     
    int MyImage::GetEncoderClsid(const WCHAR* format, CLSID* pClsid)
    {
     
    	UINT  num = 0;          // number of image encoders
    	UINT  size = 0;         // size of the image encoder array in bytes
     
    	Gdiplus::ImageCodecInfo* pImageCodecInfo = NULL;
    	Gdiplus::GetImageEncodersSize(&num, &size);
    	if (size == 0)
    		return -1;  // Failure
     
    	pImageCodecInfo = (ImageCodecInfo*)(malloc(size));
    	if (pImageCodecInfo == NULL)
    		return -1;  // Failure
     
    	Gdiplus::GetImageEncoders(num, size, pImageCodecInfo);
     
    	for (UINT j = 0; j < num; ++j)
    	{
    		if (wcscmp(pImageCodecInfo[j].MimeType, format) == 0)
    		{
    			*pClsid = pImageCodecInfo[j].Clsid;
    			free(pImageCodecInfo);
    			return j;  // Success
    		}
    	}
     
    	free(pImageCodecInfo);
     
    	return -1;  // Failure
     
    }
    Est ce que je dois ajouter une nouvelle méthode à la classe MyImage.cpp qui permet d'afficher la matrice de pixels ou quoi?? Parce que j'en ai besoin pour la classe Graph.cpp

  10. #10
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 147
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 147
    Billets dans le blog
    4
    Par défaut
    As-tu lu le code que tu proposes ?
    Tu as 2 variables nommées Pixels et PixPtr, on peut difficilement faire plus explicite.
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  11. #11
    Membre régulier
    Femme Profil pro
    Étudiant
    Inscrit en
    Février 2015
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 35
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2015
    Messages : 9
    Par défaut
    Oui je vois ça. C'est le code que m'a proposé mon encadreur pour compléter le travail. C'est pourquoi j'ai une difficulté à afficher la matrice de pixels. J ene sais pas comment faire

  12. #12
    Expert éminent

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 202
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 202
    Par défaut
    Demande lui, dans ce cas. Cela lui montrera ton intérêt.

    Par ailleurs, dans notre faq C++ (rubriques surcharge des opérateurs), il y a deux entrées sur les matrices, qui pourraient t'aider.

  13. #13
    Membre régulier
    Femme Profil pro
    Étudiant
    Inscrit en
    Février 2015
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 35
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2015
    Messages : 9
    Par défaut
    D'accord
    Je vous remercie

Discussions similaires

  1. Traitement des images dans forms6i
    Par ImedBenMansour dans le forum Forms
    Réponses: 3
    Dernier message: 19/05/2008, 17h37
  2. Traitement des images RGB
    Par tapouni dans le forum Images
    Réponses: 6
    Dernier message: 13/05/2008, 17h15
  3. traitement des images 3D en vc++
    Par karimfl dans le forum MFC
    Réponses: 0
    Dernier message: 23/04/2008, 10h26

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