[772] | 1 | // -------------------- // |
---|
| 2 | // --- ecc_features --- // |
---|
| 3 | // -------------------- // |
---|
| 4 | |
---|
| 5 | |
---|
| 6 | /* |
---|
| 7 | * Copyright (c) 2012 - 2014, Lionel Lacassagne, All rights reserved |
---|
| 8 | * University of Paris Sud, Laboratoire de Recherche en Informatique |
---|
| 9 | */ |
---|
| 10 | |
---|
| 11 | // |
---|
| 12 | // Caracteristiques d'une region / label |
---|
| 13 | // |
---|
| 14 | |
---|
| 15 | #ifndef __ECC_FEATURES_H__ |
---|
| 16 | #define __ECC_FEATURES_H__ |
---|
| 17 | |
---|
[826] | 18 | #if TARGET_OS == LINUX && PARMERGE |
---|
[821] | 19 | #include <pthread.h> |
---|
[772] | 20 | #endif |
---|
| 21 | |
---|
| 22 | |
---|
| 23 | // ------------------------------------------------------------------------ |
---|
| 24 | // --- RegionStats -------------------------------------------------------- |
---|
| 25 | // ------------------------------------------------------------------------ |
---|
| 26 | |
---|
[822] | 27 | // @QM |
---|
| 28 | // Je m'autorise à mettre des champs de la structure |
---|
| 29 | // conditionnellement vis-Ã -vis de flags, car : |
---|
| 30 | // 1. Il ne s'agit pas d'une bibliothÚque |
---|
| 31 | // 2. Tous les fichiers .c dépendent de tous les .h, et donc |
---|
| 32 | // en particulier du fichier config.h qui définit les flags |
---|
| 33 | // Il est donc impossible de mélanger deux fichiers binaires |
---|
| 34 | // qui ont des définitions différentes de cette structure |
---|
[772] | 35 | typedef struct { |
---|
[822] | 36 | #if FEATURES |
---|
| 37 | uint16 xmin; |
---|
| 38 | uint16 xmax; |
---|
| 39 | uint16 ymin; |
---|
| 40 | uint16 ymax; |
---|
[772] | 41 | |
---|
[822] | 42 | uint32 S; |
---|
[772] | 43 | |
---|
[822] | 44 | uint32 Sx; |
---|
| 45 | uint32 Sy; |
---|
| 46 | #endif |
---|
[821] | 47 | #if PARMERGE |
---|
| 48 | pthread_spinlock_t lock; |
---|
[772] | 49 | #endif |
---|
| 50 | } RegionStats; |
---|
| 51 | |
---|
| 52 | |
---|
| 53 | /* |
---|
| 54 | * ATTENTION x != (xmin+xmax)/2 |
---|
| 55 | * y != (ymin+ymax)/2 |
---|
| 56 | S != (xmax-xmin)(ymax-ymin) |
---|
| 57 | */ |
---|
| 58 | |
---|
| 59 | /* |
---|
| 60 | * n = S = phi0(x1) - phi0(x0-1) = x1 - x0 + 1 |
---|
| 61 | * Sx = phi1(x1) - phi1(x0-1) |
---|
| 62 | * Sx2 = phi2(x1) - phi2(x0-1) |
---|
| 63 | * Sx3 = phi3(x1) - phi3(x0-1) |
---|
| 64 | * Sy = nY |
---|
| 65 | * Sy2 = nY2 |
---|
| 66 | * Sxy = Y.Sx |
---|
| 67 | * Sx2y = Y.Sx2 |
---|
| 68 | * Sxy2 = Y2.Sx |
---|
| 69 | * Sy3 = nY3 |
---|
| 70 | * |
---|
| 71 | * phi1(x ) = x(x+1)/2 |
---|
| 72 | * phi1(x-1) = x(x-1)/2 |
---|
| 73 | * phi2(x ) = x(x+1)(2x+1)/6 |
---|
| 74 | * phi2(x-1) = x(x-1)(2x-1)/6 |
---|
| 75 | * phi3(x ) = Phi1(x).Phi1(x) |
---|
| 76 | * |
---|
| 77 | * Mx2 = Sx2 - Sx.Sx / n |
---|
| 78 | * My2 = Sy2 - Sy.Sy / n |
---|
| 79 | * Mxy = Sxy - Sx.Sy / n |
---|
| 80 | * |
---|
| 81 | * Mx3 = Sx3 - 3.Sx.Sx2 / n + 2.Sx.Sx.Sx / n2 |
---|
| 82 | * Mx2y = Sx2y - Sx2.Sy / n - 2.Sx.Sxy / n + 2.Sx.Sx.Sy / n2 |
---|
| 83 | * Mxy2 = Sxy2 - Sy2.Sx / n - 2.Sy.Sxy / n + 2.Sx.Sy.Sy / n2 |
---|
| 84 | * My3 = Sy3 - 3.Sy.Sy2 / n + 2.Sy.Sy.Sy / n2 |
---|
| 85 | */ |
---|
| 86 | |
---|
[821] | 87 | |
---|
| 88 | |
---|
[772] | 89 | /* ------------------------------ */ |
---|
| 90 | /* --- RegionStats after 2009 --- */ |
---|
| 91 | /* ------------------------------ */ |
---|
| 92 | // pas mieux que les fonctions precedentes -> a supprimer a terme (LL 2014) |
---|
| 93 | |
---|
| 94 | RegionStats* RegionStatsVector (int i0, int i1); |
---|
[821] | 95 | #if TARGET_OS == GIETVM |
---|
| 96 | RegionStats * remote_RegionStatsVector (int i0, int i1, int x, int y); |
---|
| 97 | #endif |
---|
[772] | 98 | RegionStats* RegionStatsVector0 (int i0, int i1); |
---|
| 99 | void free_RegionStatsVector (RegionStats *v, int i0, int i1); |
---|
| 100 | |
---|
| 101 | RegionStats** RegionStatsMatrix (int i0, int i1, int j0, int j1); |
---|
| 102 | RegionStats** RegionStatsMatrix0 (int i0, int i1, int j0, int j1); |
---|
| 103 | void free_RegionStatsMatrix(RegionStats **m, int i0, int i1, int j0, int j1); |
---|
| 104 | |
---|
| 105 | void zero_RegionStats (RegionStats *x); |
---|
| 106 | void zero_RegionStatsVector(RegionStats *v, int i0, int i1); |
---|
| 107 | void zero_RegionStatsMatrix(RegionStats **m, int i0, int i1, int j0, int j1); |
---|
| 108 | |
---|
| 109 | void display_RegionStats (RegionStats *x, char *name); |
---|
| 110 | void display_RegionStatsVector(RegionStats *v, int i0, int i1, char *name); |
---|
| 111 | void display_RegionStatsMatrix(RegionStats **m, int i0, int i1, int j0, int j1, char *name); |
---|
| 112 | |
---|
| 113 | void save_RegionStats (RegionStats *x, char *name); |
---|
| 114 | void save_RegionStatsVector(RegionStats *v, int i0, int i1, char *name); |
---|
| 115 | void save_RegionStatsMatrix(RegionStats **m, int i0, int i1, int j0, int j1, char *name); |
---|
| 116 | |
---|
| 117 | /* ----------------------------------------- */ |
---|
| 118 | /* --- RegionStats functions before 2009 --- */ |
---|
| 119 | /* ----------------------------------------- */ |
---|
| 120 | |
---|
| 121 | void RegionStats_Constructor (RegionStats **Stats, uint32 nemax); |
---|
| 122 | RegionStats* RegionStats_pConstructor( uint32 nemax); |
---|
| 123 | void RegionStats_Destructor (RegionStats **Stats, uint32 nemax); |
---|
| 124 | void RegionStats_pDestructor (RegionStats *Stats, uint32 nemax); |
---|
| 125 | void RegionStats_Clear (RegionStats *Stats, uint32 nemax); |
---|
| 126 | |
---|
| 127 | int RegionStats_Create_File (char *filename); // for read |
---|
| 128 | int RegionStats_Open_File (char *filename); // for write |
---|
| 129 | void RegionStats_Close_File (int fd); |
---|
| 130 | |
---|
| 131 | int RegionStats_Read_Header ( int fd); // return ne |
---|
| 132 | void RegionStats_Write_Header(int ne, int fd); |
---|
| 133 | |
---|
| 134 | void RegionStats_Read_Stats1 (int fd, int ne, RegionStats *stats); |
---|
| 135 | void RegionStats_Read_Stats2 (int fd, int ne, RegionStats *stats); |
---|
| 136 | |
---|
| 137 | void RegionStats_Write_Stats1(RegionStats *Stats, int ne, int fd); |
---|
| 138 | void RegionStats_Write_Stats2(RegionStats *Stats, int ne, int fd); |
---|
| 139 | |
---|
| 140 | void RegionStats_Write_Stats1_Sparse(RegionStats *Stats, uint32 *EQ, uint32 ne0, uint32 ne1, int fd); |
---|
| 141 | |
---|
| 142 | void RegionStats_Load_Stats1 (char *filename, int *ne, RegionStats **Stats); |
---|
| 143 | void RegionStats_Load_Stats2 (char *filename, int *ne, RegionStats **Stats); |
---|
| 144 | |
---|
| 145 | void RegionStats_MLoad_Stats1(char *filename, int *ne, RegionStats *Stats); // Stats must have been allocated |
---|
| 146 | void RegionStats_MLoad_Stats2(char *filename, int *ne, RegionStats *Stats); // Stats must have been allocated |
---|
| 147 | |
---|
| 148 | void RegionStats_Save_Stats1(RegionStats *Stats, int ne, char *filename); |
---|
| 149 | void RegionStats_Save_Stats2(RegionStats *Stats, int ne, char *filename); |
---|
| 150 | |
---|
| 151 | void RegionStats_Display_Stats1(RegionStats *Stats, int ne, char *name); |
---|
| 152 | void RegionStats_Display_Stats2(RegionStats *Stats, int ne, char *name); |
---|
| 153 | |
---|
| 154 | //void RegionStats_Rectangle_Computation(RegionStats *Stats, Image *imageL); |
---|
| 155 | void RegionStats_SetRectangle (RegionStats *Stats, int e, int ymin, int ymax, int xmin, int xmax); |
---|
| 156 | |
---|
| 157 | // pointeur de tableau de Stats (ECC: pour LSL parallel |
---|
| 158 | |
---|
| 159 | void RegionStats_Save_pStats1(RegionStats **pStats, int ne, char *filename); |
---|
| 160 | void RegionStats_Save_pStats2(RegionStats **pStats, int ne, char *filename); |
---|
| 161 | |
---|
| 162 | void RegionStats_Display_pStats1(RegionStats **pStats, int ne, char *name); |
---|
| 163 | void RegionStats_Display_pStats2(RegionStats **pStats, int ne, char *name); |
---|
| 164 | |
---|
| 165 | void Region32_Calc1_Features_1Pass(RegionStats *Stats, uint32 e, int i, int j); |
---|
| 166 | // faire une version pointFeaturesComputation (cf line et image) |
---|
| 167 | // ------------------------ |
---|
| 168 | // --- RegionStats 2013 --- |
---|
| 169 | // ------------------------ |
---|
| 170 | void RegionStats_Calc_Rectangle_Moment1(uint32 **E, int height, int width, RegionStats *Stats); |
---|
| 171 | void RegionStats_calc_Status(RegionStats *Stats, uint32 ne, uint32 min_height, uint32 min_width, uint32 min_area, uint8 *status); |
---|
| 172 | uint32 RegionStats_UpdateEQ_with_Status(uint8 *status, uint32 ne, uint32 *EQ); |
---|
| 173 | void RegionStats_UpdateStats_with_EQ(uint32 *EQ, uint32 ne, RegionStats *Stats); |
---|
| 174 | |
---|
| 175 | |
---|
| 176 | // RegioStats 2014 (Laurent Cabaret) |
---|
| 177 | void featuresComputation(uint32 **E, int height,int width,RegionStats *Stats); // ne plus utiliser |
---|
| 178 | |
---|
| 179 | void pointFeaturesComputation_Dummy(uint32 **E, int i, int j, RegionStats *Stats); |
---|
| 180 | void pointFeaturesComputation (uint32 **E, int i, int j, RegionStats *Stats); |
---|
| 181 | |
---|
| 182 | void lineFeaturesComputation_Dummy(uint32 **E, int i, int width, RegionStats *Stats); |
---|
| 183 | void lineFeaturesComputation (uint32 **E, int i, int width, RegionStats *Stats); |
---|
| 184 | |
---|
| 185 | void bandFeaturesComputation_Dummy(uint32 **E, int i0, int i1, int width, RegionStats *Stats); |
---|
| 186 | void bandFeaturesComputation (uint32 **E, int i0, int i1, int width, RegionStats *Stats); |
---|
| 187 | |
---|
| 188 | void imageFeaturesComputation_Dummy(uint32 **E, int height, int width, RegionStats *Stats); |
---|
| 189 | void imageFeaturesComputation (uint32 **E, int height, int width, RegionStats *Stats); |
---|
| 190 | |
---|
| 191 | // ------------------------ |
---|
| 192 | // --- RegionStats 2014 --- |
---|
| 193 | // ------------------------ |
---|
| 194 | |
---|
| 195 | void RegionStats_Copy_Stats1_From_Index(RegionStats *Stats, int dst_index, int src_index); |
---|
| 196 | void RegionStats_Accumulate_Stats1_From_Index(RegionStats *Stats, int dst_index, int src_index); |
---|
| 197 | |
---|
| 198 | void RegionStats_Save_Stats1_Sparse(RegionStats *Stats, uint32 *EQ, uint32 ne0, uint32 ne1, char *filename); |
---|
[821] | 199 | void RegionStats_DisplayStats_Sparse(uint32 *EQ, uint32 ne0, uint32 ne1, RegionStats *Stats, char *name, int * start_index); |
---|
[772] | 200 | // affichage des Stats pour les etiquettes roots/ancetres de leur composante (pour algo Suzuki) |
---|
| 201 | |
---|
| 202 | void RegionStats_DisplayStats_Range(uint32 *EQ, uint32 ne0, uint32 ne1, RegionStats *Stats, char *name); |
---|
| 203 | |
---|
| 204 | // nb de composantes connexes pour Suzuki MK2 |
---|
| 205 | uint32 RegionStats_Count_Roots_Sparse1(RegionStats *Stats, uint32 *EQ, uint32 nemax); |
---|
| 206 | uint32 RegionStats_Count_Roots_Sparse (RegionStats *Stats, uint32 *EQ, uint32 ne0, uint32 ne1); |
---|
| 207 | |
---|
| 208 | uint32 RegionStats_Count_Labels_Sparse1(RegionStats *Stats, uint32 *EQ, uint32 nemax); |
---|
| 209 | uint32 RegionStats_Count_Labels_Sparse (RegionStats *Stats, uint32 *EQ, uint32 ne0, uint32 ne1); |
---|
| 210 | |
---|
| 211 | void copy_features_ui32matrix(RegionStats *Stats, uint32 ne, uint32 **m); |
---|
| 212 | void copy_ui32matrix_features(uint32 **m, uint32 ne, RegionStats *Stats); |
---|
| 213 | void sortv_ui32matrix_col(uint32 **m, int i0, int i1, int j0, int j1, int col); |
---|
| 214 | void RegionStats_SortFeatures(RegionStats *Stats, uint32 nemax); |
---|
[821] | 215 | |
---|
[772] | 216 | int RegionStats_Compare(RegionStats *S1, RegionStats *S2); |
---|
| 217 | int RegionStatsVector_Compare(RegionStats *S1, int i0, int i1, RegionStats *S2); |
---|
| 218 | int RegionStatsVector_Match (RegionStats *S1, int i0, int i1, RegionStats *S2, int j0, int j1); |
---|
| 219 | |
---|
| 220 | |
---|
| 221 | #endif /* __FEATURES_H__ */ |
---|