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 | |
---|
18 | #if TARGET_OS == LINUX && PARMERGE |
---|
19 | #include <pthread.h> |
---|
20 | #endif |
---|
21 | |
---|
22 | |
---|
23 | // ------------------------------------------------------------------------ |
---|
24 | // --- RegionStats -------------------------------------------------------- |
---|
25 | // ------------------------------------------------------------------------ |
---|
26 | |
---|
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 |
---|
35 | typedef struct { |
---|
36 | #if FEATURES |
---|
37 | uint16 xmin; |
---|
38 | uint16 xmax; |
---|
39 | uint16 ymin; |
---|
40 | uint16 ymax; |
---|
41 | |
---|
42 | uint32 S; |
---|
43 | |
---|
44 | uint32 Sx; |
---|
45 | uint32 Sy; |
---|
46 | #endif |
---|
47 | #if PARMERGE |
---|
48 | pthread_spinlock_t lock; |
---|
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 | |
---|
87 | |
---|
88 | |
---|
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); |
---|
95 | #if TARGET_OS == GIETVM |
---|
96 | RegionStats * remote_RegionStatsVector (int i0, int i1, int x, int y); |
---|
97 | #endif |
---|
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); |
---|
199 | void RegionStats_DisplayStats_Sparse(uint32 *EQ, uint32 ne0, uint32 ne1, RegionStats *Stats, char *name, int * start_index); |
---|
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); |
---|
215 | |
---|
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__ */ |
---|