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.
![]()
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.
![]()
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++)
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
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.
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�.
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)
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":
Mon probl�me comment je cr�e la matrice de pixels de mon image?
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; }
Tu l'as, vu que tu dis avoir lu l'image
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 :/
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
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 }
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.
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![]()
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.
Partager