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