cpp:ps
Differences
This shows you the differences between two versions of the page.
| Next revision | Previous revision | ||
| cpp:ps [2022/06/22 12:01] – créée francois | cpp:ps [2022/12/09 09:39] (current) – charles | ||
|---|---|---|---|
| Line 1: | Line 1: | ||
| ====== Exemple Pattern Spectra ====== | ====== Exemple Pattern Spectra ====== | ||
| - | Dans cet exemple, nous allons réaliser un programme qui produit des fichiers HDF5 (binaire structuré) contenant des tableau | + | Dans cet exemple, nous allons réaliser un programme qui produit des fichiers HDF5 (binaire structuré) contenant des tableaux |
| + | Le programme prend 2 arguments : | ||
| + | * le nom du fichier contenant l' | ||
| + | * le nom du fichier qui les données produites (principalement un pattern spectra) | ||
| + | Dans cet exemple nous proposons de réaliser un pattern spectra à 2 dimensions. Cela signifie que la contribution de chaque nœud sera cumulé en fonction | ||
| + | * de la taille du nœud | ||
| + | * et de sa caractéristique d' | ||
| + | |||
| + | ===== Visualisation ===== | ||
| + | |||
| + | Nous avons utilisé un script python pour visualiser le tableau à 2 dimensions. | ||
| + | Nous avons joué avec les paramètres pour disposer d'axes linéaires ou logarithmiques. | ||
| ^ ^ linear | ^ ^ linear | ||
| Line 8: | Line 19: | ||
| ^ log ^ {{ : | ^ log ^ {{ : | ||
| + | ===== Code ===== | ||
| + | |||
| + | Il faut commencer par les déclarations d' | ||
| <code c++> | <code c++> | ||
| #include < | #include < | ||
| Line 25: | Line 39: | ||
| </ | </ | ||
| + | Nous aurons besoin des quelques classes fondamentales : la structure d' | ||
| <code c++> | <code c++> | ||
| #include " | #include " | ||
| Line 33: | Line 48: | ||
| </ | </ | ||
| + | En fonction de ce qui a été déclaré, il peut être utile de simplifier les appels en omettant le contexte d' | ||
| <code c++> | <code c++> | ||
| using namespace std; | using namespace std; | ||
| Line 40: | Line 56: | ||
| </ | </ | ||
| + | Dans notre exemple, nous nous limiterons à des images 2D et la construction d'un arbre MAX. | ||
| + | Nous préfererons un histogramme logarithmique par défaut. | ||
| + | Nous choisissons un pattern spectra de 900 casses (30 bin x 30 bin). | ||
| + | La compression HDF5 a besoin de paramètres propres (taux de compression, | ||
| <code c++> | <code c++> | ||
| - | inline unsigned int abs (unsigned int x) { return x;} | ||
| - | |||
| typedef uint16_t DimBin; | typedef uint16_t DimBin; | ||
| static const int GeoDimT (2); | static const int GeoDimT (2); | ||
| - | static TreeType treeType = MAX; | + | static |
| - | static DimBin linearCompactBin (false), linearAreaBin (false); | + | static |
| - | static DimBin binCompactCount (30), binAreaCount (30); | + | static |
| - | static unsigned int compressLevel (5); | + | static |
| - | static size_t cacheSize (1024*1024); | + | static |
| </ | </ | ||
| + | Nous déclarons la fonction '' | ||
| <code c++> | <code c++> | ||
| template< | template< | ||
| </ | </ | ||
| + | |||
| + | Nous définissons une fonction créant des intervalles (au nombre de '' | ||
| <code c++> | <code c++> | ||
| Line 70: | Line 91: | ||
| </ | </ | ||
| + | Nous définissons une fonction créant des intervalles (au nombre de '' | ||
| <code c++> | <code c++> | ||
| /** Create linear bin */ | /** Create linear bin */ | ||
| Line 82: | Line 104: | ||
| </ | </ | ||
| + | Le point d' | ||
| + | |||
| + | * argv[0] : nom du programme | ||
| + | * argv[1] : nom du fichier contenant l' | ||
| + | * argv[2] : nom du fichier contenant les données produites | ||
| <code c++> | <code c++> | ||
| int | int | ||
| Line 94: | Line 121: | ||
| </ | </ | ||
| + | En fonction des pixels de l' | ||
| <code c++> | <code c++> | ||
| switch (inputImage.getDataType ()) { | switch (inputImage.getDataType ()) { | ||
| Line 119: | Line 147: | ||
| </ | </ | ||
| + | Voici la fonction principale du programme. | ||
| + | Elle commence par lire les pixels. | ||
| <code c++> | <code c++> | ||
| template< | template< | ||
| Line 128: | Line 158: | ||
| Raster< | Raster< | ||
| // image size (width x height) | // image size (width x height) | ||
| - | Size< | + | |
| // read first band (0) in 2D mode from origine [0,0] to end [width, height]. | // read first band (0) in 2D mode from origine [0,0] to end [width, height]. | ||
| inputImage.readBand (raster, 0, NullPoint2D, | inputImage.readBand (raster, 0, NullPoint2D, | ||
| </ | </ | ||
| + | Nous déclarons l' | ||
| <code c++> | <code c++> | ||
| cout << "Build tree" << endl; | cout << "Build tree" << endl; | ||
| // no border (i.e. all pixels are take in account) | // no border (i.e. all pixels are take in account) | ||
| - | Border< | + | |
| // neighbors take in account (default connectivity C4) | // neighbors take in account (default connectivity C4) | ||
| - | GraphWalker< | + | |
| // tree builder base on raster, connectivity and type of tree | // tree builder base on raster, connectivity and type of tree | ||
| ArrayTreeBuilder< | ArrayTreeBuilder< | ||
| Line 149: | Line 180: | ||
| </ | </ | ||
| + | Nous déclenchons la construction de l' | ||
| + | * ATB contient les éléments de l' | ||
| + | * tree coquille vide qui va contenir l' | ||
| + | * weightAttributes est le premier tableau d' | ||
| <code c++> | <code c++> | ||
| atb.buildTree (tree, weightAttributes); | atb.buildTree (tree, weightAttributes); | ||
| </ | </ | ||
| + | Nous créons autant de tableau d' | ||
| <code c++> | <code c++> | ||
| // create area attribute | // create area attribute | ||
| cout << "Build Area Attributes" | cout << "Build Area Attributes" | ||
| - | AreaAttributes< | + | |
| cout << "Build Perimeter Attributes" | cout << "Build Perimeter Attributes" | ||
| - | PerimeterAttributes< | + | |
| cout << "Build Compactness Attributes" | cout << "Build Compactness Attributes" | ||
| - | CompactnessAttributes< | + | |
| </ | </ | ||
| + | Nous construisons des intervalles de valeurs (abscisses et ordonnées). | ||
| <code c++> | <code c++> | ||
| cout << "Build PS" << endl; | cout << "Build PS" << endl; | ||
| - | | + | |
| - | vector< | + | |
| linearSpace (0., 1., binCompactCount) : | linearSpace (0., 1., binCompactCount) : | ||
| logSpace (1./ | logSpace (1./ | ||
| - | vector< | + | |
| linearSpace (1., MaxArea, binAreaCount) : | linearSpace (1., MaxArea, binAreaCount) : | ||
| logSpace (1, MaxArea, binAreaCount); | logSpace (1, MaxArea, binAreaCount); | ||
| </ | </ | ||
| + | Nous calculons le pattern spectra en parcourant tous les nœuds. | ||
| <code c++> | <code c++> | ||
| vector< | vector< | ||
| Line 182: | Line 220: | ||
| for (DimParent compId = 0; compId < rootId; ++compId) { | for (DimParent compId = 0; compId < rootId; ++compId) { | ||
| - | DimBin areaBinId = lower_bound (areaScale.begin (), areaScale.end (), double (areaValues[compId])) - areaScale.begin (); | + | |
| - | DimBin compactBinId = lower_bound (compactScale.begin (), compactScale.end (), double (compactValues[compId])) - compactScale.begin (); | + | |
| - | double diff = abs (double (weightValues[compId])- | + | |
| - | double (weightValues[tree.getCompParent (compId)])); | + | double (weightValues[tree.getCompParent (compId)])); |
| - | double volume = diff * areaValues[compId]; | + | |
| - | size_t id (compactBinId + areaBinId * binCompactCount); | + | |
| psTab [id] += volume; | psTab [id] += volume; | ||
| } | } | ||
| </ | </ | ||
| + | Nous construisons, | ||
| <code c++> | <code c++> | ||
| vector< | vector< | ||
| Line 204: | Line 243: | ||
| </ | </ | ||
| + | Nous sauvons les valeurs dans un fichier HDF5. | ||
| <code c++> | <code c++> | ||
| cout << "Write HDF5" << endl; | cout << "Write HDF5" << endl; | ||
| Line 221: | Line 261: | ||
| </ | </ | ||
| + | ===== Résultat ===== | ||
| + | |||
| + | La commande '' | ||
| + | * PS : Tableau à 2 dimension contenant le Pattern Spectra ('' | ||
| + | * XLabel, XTick : Nom de l'axe des abscisses et des intervalles choisis | ||
| + | * YLabel, Ytick : Nom de l'axe des abscisses et des intervalles choisis | ||
| + | * patchPSBinIdx, | ||
| + | <code bash> | ||
| + | $ h5ls arles.kor | ||
| + | PS | ||
| + | XLabel | ||
| + | XTick Dataset {30} | ||
| + | YLabel | ||
| + | Ytick Dataset {30} | ||
| + | patchPSBinIdx | ||
| + | patchPSBinVal | ||
| + | </ | ||
| + | |||
| + | La commande '' | ||
| + | <code bash> | ||
| + | $ h5dump arles.kor | ||
| + | HDF5 " | ||
| + | GROUP "/" | ||
| + | </ | ||
| + | |||
| + | Le Pattern Spectra est constitué de 30 x 30 cases. | ||
| + | <code bash> | ||
| + | | ||
| + | DATATYPE | ||
| + | DATASPACE | ||
| + | DATA { | ||
| + | (0): 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, | ||
| + | ... | ||
| + | (883): 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 | ||
| + | } | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | Voici les information permettant de reconstituer l'axe des abscisses. | ||
| + | <code bash> | ||
| + | | ||
| + | DATATYPE | ||
| + | | ||
| + | | ||
| + | CSET H5T_CSET_ASCII; | ||
| + | CTYPE H5T_C_S1; | ||
| + | } | ||
| + | DATASPACE | ||
| + | DATA { | ||
| + | (0): " | ||
| + | } | ||
| + | } | ||
| + | | ||
| + | DATATYPE | ||
| + | DATASPACE | ||
| + | DATA { | ||
| + | (0): 0, 0.0344828, 0.0689655, 0.103448, 0.137931, 0.172414, 0.206897, | ||
| + | ... | ||
| + | (25): 0.862069, 0.896552, 0.931034, 0.965517, 1 | ||
| + | } | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | Voici les information permettant de reconstituer l'axe des ordonnées. | ||
| + | <code bash> | ||
| + | | ||
| + | DATATYPE | ||
| + | | ||
| + | | ||
| + | CSET H5T_CSET_ASCII; | ||
| + | CTYPE H5T_C_S1; | ||
| + | } | ||
| + | DATASPACE | ||
| + | DATA { | ||
| + | (0): " | ||
| + | } | ||
| + | } | ||
| + | | ||
| + | DATATYPE | ||
| + | DATASPACE | ||
| + | DATA { | ||
| + | (0): 1, 1.75326, 3.07394, 5.38942, 9.44908, 16.5667, 29.0459, 50.9251, | ||
| + | ... | ||
| + | (28): 6.72556e+06, | ||
| + | } | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | Pour l' | ||
| + | <code bash> | ||
| + | |||
| + | | ||
| + | DATATYPE | ||
| + | DATASPACE | ||
| + | DATA { | ||
| + | (0): 70, 75, 96, 98, 100, 124, 125, 126, 127, 152, 153, 154, 155, 156, | ||
| + | ... | ||
| + | (66): 841, 871, 872 | ||
| + | } | ||
| + | } | ||
| + | | ||
| + | DATATYPE | ||
| + | DATASPACE | ||
| + | DATA { | ||
| + | (0): 6.7979e+06, 7.63336e+06, | ||
| + | ... | ||
| + | (66): 3.50345e+09, | ||
| + | } | ||
| + | } | ||
| + | } | ||
| + | } | ||
| + | </ | ||
cpp/ps.1655899317.txt.gz · Last modified: by francois