cpp:ps
Differences
This shows you the differences between two versions of the page.
Both sides previous revisionPrevious revisionNext revision | Previous revision | ||
cpp:ps [2022/06/22 12:16] – francois | cpp:ps [2022/12/09 09:39] (current) – charles | ||
---|---|---|---|
Line 1: | Line 1: | ||
====== Exemple Pattern Spectra ====== | ====== Exemple Pattern Spectra ====== | ||
- | ===== Visualisation ===== | + | Dans cet exemple, nous allons réaliser un programme qui produit des fichiers HDF5 (binaire structuré) contenant des tableaux à 2 dimensions de pattern spectra. |
+ | 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' | ||
- | Dans cet exemple, nous allons réaliser un programme qui produit des fichiers HDF5 (binaire structuré) contenant des tableau à 2 dimension de pattern spectra. | + | ===== 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 12: | Line 20: | ||
===== Code ===== | ===== Code ===== | ||
+ | |||
+ | Il faut commencer par les déclarations d' | ||
<code c++> | <code c++> | ||
#include < | #include < | ||
Line 29: | Line 39: | ||
</ | </ | ||
+ | Nous aurons besoin des quelques classes fondamentales : la structure d' | ||
<code c++> | <code c++> | ||
#include " | #include " | ||
Line 37: | 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 44: | 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 74: | 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 86: | 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 98: | Line 121: | ||
</ | </ | ||
+ | En fonction des pixels de l' | ||
<code c++> | <code c++> | ||
switch (inputImage.getDataType ()) { | switch (inputImage.getDataType ()) { | ||
Line 123: | Line 147: | ||
</ | </ | ||
+ | Voici la fonction principale du programme. | ||
+ | Elle commence par lire les pixels. | ||
<code c++> | <code c++> | ||
template< | template< | ||
Line 132: | 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 153: | 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 186: | 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 208: | Line 243: | ||
</ | </ | ||
+ | Nous sauvons les valeurs dans un fichier HDF5. | ||
<code c++> | <code c++> | ||
cout << "Write HDF5" << endl; | cout << "Write HDF5" << endl; | ||
Line 226: | Line 262: | ||
===== Résultat ===== | ===== 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> | <code bash> | ||
$ h5ls arles.kor | $ h5ls arles.kor | ||
Line 237: | Line 279: | ||
</ | </ | ||
+ | La commande '' | ||
<code bash> | <code bash> | ||
$ h5dump arles.kor | $ h5dump arles.kor | ||
HDF5 " | HDF5 " | ||
GROUP "/" | GROUP "/" | ||
+ | </ | ||
+ | |||
+ | Le Pattern Spectra est constitué de 30 x 30 cases. | ||
+ | <code bash> | ||
| | ||
DATATYPE | DATATYPE | ||
Line 252: | Line 299: | ||
</ | </ | ||
- | Abscisse | + | Voici les information permettant de reconstituer l'axe des abscisses. |
<code bash> | <code bash> | ||
| | ||
Line 277: | Line 324: | ||
</ | </ | ||
- | Ordonnée | + | Voici les information permettant de reconstituer l'axe des ordonnées. |
<code bash> | <code bash> | ||
| | ||
Line 301: | Line 348: | ||
} | } | ||
</ | </ | ||
- | Données réduites | + | |
+ | Pour l' | ||
<code bash> | <code bash> | ||
cpp/ps.1655900181.txt.gz · Last modified: 2022/06/22 12:16 by francois