1 | /*!\file: HoleFillerx.cpp
|
---|
2 | * \brief plug missing values of a double* array, using interpolation techniques. This
|
---|
3 | * is an adaptation of Dr. Crippen's routine (Jet Propulsion Lab, see HoleFillerCrippen.c
|
---|
4 | * for more details.
|
---|
5 | */
|
---|
6 |
|
---|
7 | #include "./HoleFillerx.h"
|
---|
8 |
|
---|
9 | #include <stdio.h>
|
---|
10 | #include <time.h>
|
---|
11 | #include "../shared/shared.h"
|
---|
12 |
|
---|
13 | int HoleFillerx(double** pimageout,double* image, int lines,int samps,int smooth){
|
---|
14 |
|
---|
15 | FILE *fp1;
|
---|
16 | unsigned long filesize;
|
---|
17 | long infinit;
|
---|
18 | double temp;
|
---|
19 | long i, j, k, l, ii, jj, bytes;
|
---|
20 | long iii, jjj;
|
---|
21 | long count, test, prevlines, prevpix, test1, test2, thresh,counter;
|
---|
22 | long bell, cycles, leftovers;
|
---|
23 | float howlong;
|
---|
24 | float nsteps, ssteps, wsteps, esteps;
|
---|
25 | float nwsteps, nesteps, swsteps, sesteps;
|
---|
26 | float north, south, east, west;
|
---|
27 | float nw, sw, ne, se, elev, range;
|
---|
28 | float nnesteps, enesteps, esesteps, ssesteps;
|
---|
29 | float sswsteps, wswsteps, wnwsteps, nnwsteps;
|
---|
30 | float nne, ene, ese, sse;
|
---|
31 | float ssw, wsw, wnw, nnw;
|
---|
32 | float sum;
|
---|
33 |
|
---|
34 | time_t t1, t2;
|
---|
35 |
|
---|
36 | /*output: */
|
---|
37 | double* imageout=NULL;
|
---|
38 |
|
---|
39 | double* image2=NULL;
|
---|
40 | double* image3=NULL;
|
---|
41 | double* image4=NULL;
|
---|
42 |
|
---|
43 | /*Added to original routine: */
|
---|
44 | int imageoutsize;
|
---|
45 |
|
---|
46 | #ifdef _ISSM_DEBUG_
|
---|
47 | if ( smooth == 1 ){
|
---|
48 | printf("Data patches will be SMOOTHED. \n");
|
---|
49 | }
|
---|
50 | if ( smooth == 0 ){
|
---|
51 | printf("Data patches will NOT be smoothed. \n");
|
---|
52 | }
|
---|
53 | #endif
|
---|
54 |
|
---|
55 | /*^^^^^^^^^^^^^ Remove pixels close to the holes ^^^^^^^^^^^^^*/
|
---|
56 | image2 = (double*) xmalloc( lines*samps*sizeof(double));
|
---|
57 | memcpy(image2,image,lines*samps*sizeof(double));
|
---|
58 |
|
---|
59 | for ( i = 0; i < lines; i++ ){
|
---|
60 | for ( j = 0; j < samps; j++ ){
|
---|
61 | if ( *(image+i*samps+j) == 0 ){
|
---|
62 | if ( (j > 3) && (j < samps-4) && (i > 3) && (i < lines-4)){
|
---|
63 | for ( k = 0; k < 4; k++ ){
|
---|
64 | for ( l = 0; l < 4; l++ ){
|
---|
65 | *(image2+samps*(i+k)+j+l)=0;
|
---|
66 | *(image2+samps*(i-k)+j+l)=0;
|
---|
67 | *(image2+samps*(i+k)+j-l)=0;
|
---|
68 | *(image2+samps*(i-k)+j-l)=0;
|
---|
69 |
|
---|
70 | }
|
---|
71 | }
|
---|
72 | }
|
---|
73 | }
|
---|
74 | }
|
---|
75 | }
|
---|
76 |
|
---|
77 | image3 = (double*) xmalloc( lines*samps*sizeof(double));
|
---|
78 | memcpy(image3,image2,lines*samps*sizeof(double));
|
---|
79 |
|
---|
80 | count += 2;
|
---|
81 | #ifdef _DEBUG2_
|
---|
82 | counter=0;
|
---|
83 | for ( i = 0; i < lines; i++ ) {
|
---|
84 | for ( j = 0; j < samps; j++ ){
|
---|
85 | if ( *(image2+i*samps+j) != 0 ) {
|
---|
86 | counter++;
|
---|
87 | }
|
---|
88 | }
|
---|
89 | }
|
---|
90 | printf( "\n" );
|
---|
91 | printf("Number of zeroes remaining: %10ld",lines*samps-counter);
|
---|
92 | fflush( stdout );
|
---|
93 | #endif
|
---|
94 |
|
---|
95 | #ifdef _ISSM_DEBUG_
|
---|
96 | printf( "\n" );
|
---|
97 | printf( "Iterations %5ld and %5ld.", count-1, count );
|
---|
98 | fflush( stdout );
|
---|
99 | #endif
|
---|
100 | goto afterfirst2;
|
---|
101 |
|
---|
102 | again2:
|
---|
103 |
|
---|
104 | count += 2;
|
---|
105 |
|
---|
106 | #ifdef _DEBUG2_
|
---|
107 | counter=0;
|
---|
108 | for ( i = 0; i < lines; i++ ) {
|
---|
109 | for ( j = 0; j < samps; j++ ){
|
---|
110 | if ( *(image2+i*samps+j) != 0 ) {
|
---|
111 | counter++;
|
---|
112 | }
|
---|
113 | }
|
---|
114 | }
|
---|
115 | // n u m b e r o f z e r o e s r e m a i n i n g : 1 2 3 4 5 6 7 8 9 10
|
---|
116 | printf( "\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b" );
|
---|
117 | printf("Number of zeroes remaining: %10ld",lines*samps-counter);
|
---|
118 | fflush( stdout );
|
---|
119 | #endif
|
---|
120 |
|
---|
121 | #ifdef _ISSM_DEBUG_
|
---|
122 | printf( "\b\b\b\b\b\b\b\b\b\b\b\b\b\b" );
|
---|
123 | printf( "\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b" );
|
---|
124 | printf( "Iterations %5ld and %5ld.", count-1, count );
|
---|
125 | fflush( stdout );
|
---|
126 | #endif
|
---|
127 |
|
---|
128 | afterfirst2:
|
---|
129 |
|
---|
130 | /***************** FIRST RUN *********************/
|
---|
131 | /*
|
---|
132 | fprintf ( stdout, "First Application: " ); time(&t2); printf( ctime(&t2) );
|
---|
133 | */
|
---|
134 | for ( i = 0; i < lines; i++ ){
|
---|
135 | for ( j = 0; j < samps; j++ ){
|
---|
136 | if ( *(image2+i*samps+j) != 0 ){
|
---|
137 | *(image3+samps*i+j) = *(image2+i*samps+j);
|
---|
138 | continue;
|
---|
139 | }
|
---|
140 |
|
---|
141 | /* Count All Neighbors Test */
|
---|
142 | test = 0;
|
---|
143 | for ( ii = i-1; ii < i+2; ii++ ){
|
---|
144 | for ( jj = j-1; jj < j+2; jj++ ){
|
---|
145 | if (( ii < 0 ) || ( ii >= lines )) continue;
|
---|
146 | if (( jj < 0 ) || ( jj >= samps )) continue;
|
---|
147 | if ( *(image2+ii*samps+jj) != 0 ) test += 1;
|
---|
148 | }
|
---|
149 | }
|
---|
150 | if ( test < 3 ){
|
---|
151 | *(image3+samps*i+j) = 0;
|
---|
152 | continue;
|
---|
153 | }
|
---|
154 |
|
---|
155 | /* For void edge pixels: */
|
---|
156 |
|
---|
157 | nsteps = 0.0; ssteps = 0.0; esteps = 0.0; wsteps = 0.0;
|
---|
158 | nwsteps = 0.0; nesteps = 0.0; swsteps = 0.0; sesteps = 0.0;
|
---|
159 | north = 0.0; south = 0.0; east = 0.0; west = 0.0;
|
---|
160 | nw = 0.0; ne = 0.0; sw = 0.0; se = 0.0;
|
---|
161 |
|
---|
162 | nnesteps = 0.0; enesteps = 0.0; esesteps = 0.0; ssesteps = 0.0;
|
---|
163 | sswsteps = 0.0; wswsteps = 0.0; wnwsteps = 0.0; nnwsteps = 0.0;
|
---|
164 | nne = 0.0; ene = 0.0; ese = 0.0; sse = 0.0;
|
---|
165 | ssw = 0.0; wsw = 0.0; wnw = 0.0; nnw = 0.0;
|
---|
166 |
|
---|
167 |
|
---|
168 | /** NSEW **/
|
---|
169 | for ( ii = i - 1; ii >= 0; ii-- ){ /* North */
|
---|
170 | if ( ii <= 0 ) { north = 0; nsteps = 0; break;}
|
---|
171 | if ( *(image2+ii*samps+j) != 0 ){ north = *(image2+ii*samps+j); nsteps = i - ii; break;}
|
---|
172 | }
|
---|
173 |
|
---|
174 | for ( ii = i + 1; ii < lines; ii++ ){ /* South */
|
---|
175 | if ( ii >= lines-1 ){ south = 0; ssteps = 0; break;}
|
---|
176 | if ( *(image2+ii*samps+j) != 0 ){ south = *(image2+ii*samps+j); ssteps = ii - i; break;}
|
---|
177 | }
|
---|
178 |
|
---|
179 | for ( jj = j - 1; jj >= 0; jj-- ){ /* West */
|
---|
180 | if ( jj <= 0 ) { west = 0; wsteps = 0; break;}
|
---|
181 | if ( *(image2+i*samps+jj) != 0 ){ west = *(image2+i*samps+jj); wsteps = j - jj; break;}
|
---|
182 | }
|
---|
183 |
|
---|
184 | for ( jj = j + 1; jj < samps; jj++ ){ /* East */
|
---|
185 | if ( jj >= samps-1 ){ east = 0; esteps = 0; break;}
|
---|
186 | if ( *(image2+i*samps+jj) != 0 ){ east = *(image2+i*samps+jj); esteps = jj - j; break;}
|
---|
187 | }
|
---|
188 |
|
---|
189 |
|
---|
190 | /** Diagonals **/
|
---|
191 | /* Southeast */
|
---|
192 | for ( k = 1; k < infinit; k++ ){
|
---|
193 | ii = i + k; jj = j + k;
|
---|
194 | if (( ii == lines ) || ( jj == samps )){ se = 0; sesteps = 0; break;}
|
---|
195 | if ( *(image2+ii*samps+jj) != 0 ){ se = *(image2+ii*samps+jj); sesteps = 1.4142 * k; break;}
|
---|
196 | }
|
---|
197 |
|
---|
198 | /* Northeast */
|
---|
199 | for ( k = 1; k < infinit; k++ ){
|
---|
200 | ii = i - k; jj = j + k;
|
---|
201 | if (( ii == -1 ) || ( jj == samps )){ ne = 0; nesteps = 0; break;}
|
---|
202 | if ( *(image2+ii*samps+jj) != 0 ){ ne = *(image2+ii*samps+jj); nesteps = 1.4142 * k; break;}
|
---|
203 | }
|
---|
204 |
|
---|
205 | /* Northwest */
|
---|
206 | for ( k = 1; k < infinit; k++ ){
|
---|
207 | ii = i - k; jj = j - k;
|
---|
208 | if (( ii == -1 ) || ( jj == -1 )){ nw = 0; nwsteps = 0; break;}
|
---|
209 | if ( *(image2+ii*samps+jj) != 0 ){ nw = *(image2+ii*samps+jj); nwsteps = 1.4142 * k; break;}
|
---|
210 | }
|
---|
211 |
|
---|
212 | /* Southwest */
|
---|
213 | for ( k = 1; k < infinit; k++ ){
|
---|
214 | ii = i + k; jj = j - k;
|
---|
215 | if (( ii == lines ) || ( jj == -1 )){ sw = 0; swsteps = 0; break;}
|
---|
216 | if ( *(image2+ii*samps+jj) != 0 ){ sw = *(image2+ii*samps+jj); swsteps = 1.4142 * k; break;}
|
---|
217 | }
|
---|
218 |
|
---|
219 | /** Other 8 **/
|
---|
220 | /* NNE */
|
---|
221 | for ( k = 1; k < infinit; k++ ){
|
---|
222 | ii = i - (k*2); jj = j + k;
|
---|
223 | if (( ii <= -1 ) || ( jj >= samps )){ nne = 0; nnesteps = 0; break;}
|
---|
224 | if ( *(image2+ii*samps+jj) != 0 ){ nne = *(image2+ii*samps+jj); nnesteps = 2.2361 * k; break;}
|
---|
225 | }
|
---|
226 |
|
---|
227 | /* ENE */
|
---|
228 | for ( k = 1; k < infinit; k++ ){
|
---|
229 | ii = i - k; jj = j + (k*2);
|
---|
230 | if (( ii <= -1 ) || ( jj >= samps )){ ene = 0; enesteps = 0; break;}
|
---|
231 | if ( *(image2+ii*samps+jj) != 0 ){ ene = *(image2+ii*samps+jj); enesteps = 2.2361 * k; break;}
|
---|
232 | }
|
---|
233 |
|
---|
234 | /* ESE */
|
---|
235 | for ( k = 1; k < infinit; k++ ){
|
---|
236 | ii = i + k; jj = j + (k*2);
|
---|
237 | if (( ii >= lines ) || ( jj >= samps )){ ese = 0; esesteps = 0; break;}
|
---|
238 | if ( *(image2+ii*samps+jj) != 0 ){ ese = *(image2+ii*samps+jj); esesteps = 2.2361 * k; break;}
|
---|
239 | }
|
---|
240 |
|
---|
241 | /* SSE */
|
---|
242 | for ( k = 1; k < infinit; k++ ){
|
---|
243 | ii = i + (k*2); jj = j + k;
|
---|
244 | if (( ii >= lines ) || ( jj >= samps )){ sse = 0; ssesteps = 0; break;}
|
---|
245 | if ( *(image2+ii*samps+jj) != 0 ){ sse = *(image2+ii*samps+jj); ssesteps = 2.2361 * k; break;}
|
---|
246 | }
|
---|
247 |
|
---|
248 | /* SSW */
|
---|
249 | for ( k = 1; k < infinit; k++ ){
|
---|
250 | ii = i + (k*2); jj = j - k;
|
---|
251 | if (( ii >= lines ) || ( jj <= -1 )){ ssw = 0; sswsteps = 0; break;}
|
---|
252 | if ( *(image2+ii*samps+jj) != 0 ){ ssw = *(image2+ii*samps+jj); sswsteps = 2.2361 * k; break;}
|
---|
253 | }
|
---|
254 |
|
---|
255 | /* WSW */
|
---|
256 | for ( k = 1; k < infinit; k++ ){
|
---|
257 | ii = i + k; jj = j - (k*2);
|
---|
258 | if (( ii >= lines ) || ( jj <= -1 )){ wsw = 0; wswsteps = 0; break;}
|
---|
259 | if ( *(image2+ii*samps+jj) != 0 ){ wsw = *(image2+ii*samps+jj); wswsteps = 2.2361 * k; break;}
|
---|
260 | }
|
---|
261 |
|
---|
262 | /* WNW */
|
---|
263 | for ( k = 1; k < infinit; k++ ){
|
---|
264 | ii = i - k; jj = j - (k*2);
|
---|
265 | if (( ii <= -1 ) || ( jj <= -1 )){ wnw = 0; wnwsteps = 0; break;}
|
---|
266 | if ( *(image2+ii*samps+jj) != 0 ){ wnw = *(image2+ii*samps+jj); wnwsteps = 2.2361 * k; break;}
|
---|
267 | }
|
---|
268 |
|
---|
269 | /* NNW */
|
---|
270 | for ( k = 1; k < infinit; k++ ){
|
---|
271 | ii = i - (k*2); jj = j - k;
|
---|
272 | if (( ii <= -1 ) || ( jj <= -1 )){ nnw = 0; nnwsteps = 0; break;}
|
---|
273 | if ( *(image2+ii*samps+jj) != 0 ){ nnw = *(image2+ii*samps+jj); nnwsteps = 2.2361 * k; break;}
|
---|
274 | }
|
---|
275 |
|
---|
276 | elev = 0; range = 0;
|
---|
277 | /*NSEW*/
|
---|
278 | if ( nsteps > 0.5 ){ elev += north / nsteps; range += 1.00 / nsteps;}
|
---|
279 | if ( ssteps > 0.5 ){ elev += south / ssteps; range += 1.00 / ssteps;}
|
---|
280 | if ( esteps > 0.5 ){ elev += east / esteps; range += 1.00 / esteps;}
|
---|
281 | if ( wsteps > 0.5 ){ elev += west / wsteps; range += 1.00 / wsteps;}
|
---|
282 | /*Diag*/
|
---|
283 | if ( nwsteps > 0.5 ){ elev += nw / nwsteps; range += 1.00 / nwsteps;}
|
---|
284 | if ( nesteps > 0.5 ){ elev += ne / nesteps; range += 1.00 / nesteps;}
|
---|
285 | if ( swsteps > 0.5 ){ elev += sw / swsteps; range += 1.00 / swsteps;}
|
---|
286 | if ( sesteps > 0.5 ){ elev += se / sesteps; range += 1.00 / sesteps;}
|
---|
287 |
|
---|
288 | /*Other 8*/
|
---|
289 | if ( nnesteps > 0.5 ){ elev += nne / nnesteps; range += 1.00 / nnesteps;}
|
---|
290 | if ( enesteps > 0.5 ){ elev += ene / enesteps; range += 1.00 / enesteps;}
|
---|
291 | if ( esesteps > 0.5 ){ elev += ese / esesteps; range += 1.00 / esesteps;}
|
---|
292 | if ( ssesteps > 0.5 ){ elev += sse / ssesteps; range += 1.00 / ssesteps;}
|
---|
293 | if ( sswsteps > 0.5 ){ elev += ssw / sswsteps; range += 1.00 / sswsteps;}
|
---|
294 | if ( wswsteps > 0.5 ){ elev += wsw / wswsteps; range += 1.00 / wswsteps;}
|
---|
295 | if ( wnwsteps > 0.5 ){ elev += wnw / wnwsteps; range += 1.00 / wnwsteps;}
|
---|
296 | if ( nnwsteps > 0.5 ){ elev += nnw / nnwsteps; range += 1.00 / nnwsteps;}
|
---|
297 |
|
---|
298 | //temp = ( elev / range ) + 0.5 ;
|
---|
299 | temp = ( elev / range );
|
---|
300 | //+ 0.5 ;
|
---|
301 | //if ( temp > 10000 ) temp = 10000;
|
---|
302 | //if ( temp < 0 ) temp = 0;
|
---|
303 |
|
---|
304 | #ifdef _DEBUG2_
|
---|
305 | //printf("%g %g %g \n",temp,elev,range);
|
---|
306 | #endif
|
---|
307 |
|
---|
308 | *(image3+samps*i+j) = temp ;
|
---|
309 | }
|
---|
310 | }
|
---|
311 |
|
---|
312 |
|
---|
313 |
|
---|
314 | for ( i = 0; i < lines; i++ ){
|
---|
315 | for ( j = 0; j < samps; j++ ){
|
---|
316 | *(image2+samps*i+j)= *(image3+samps*i+j);
|
---|
317 | }
|
---|
318 | }
|
---|
319 |
|
---|
320 |
|
---|
321 | for ( i = 0; i < lines; i++ ){
|
---|
322 | for ( j = 0; j < samps; j++ ){
|
---|
323 | if ( *(image2+samps*i+j) == 0 ) goto again2;
|
---|
324 | }
|
---|
325 | }
|
---|
326 |
|
---|
327 | if ( smooth == 0 ) goto there2;
|
---|
328 |
|
---|
329 |
|
---|
330 | /************************ SMOOTH THE RESULT ***********************/
|
---|
331 |
|
---|
332 | image4 = (double*) xmalloc( lines*samps*sizeof(double));
|
---|
333 | memcpy(image4,image3,lines*samps*sizeof(double));
|
---|
334 |
|
---|
335 |
|
---|
336 | for ( i = 0; i < lines; i++ ) {
|
---|
337 | for ( j = 0; j < samps; j++ ) {
|
---|
338 | if ( *(image4+i*samps+j) != 0 ) { *(image3+i*samps+j) = *(image2+i*samps+j) ; continue; }
|
---|
339 |
|
---|
340 |
|
---|
341 | for ( k = 1; k < infinit; k++ ) { /* Find the smallest box size with data */
|
---|
342 | for ( ii = i-k; ii <= i+k; ii++ ){
|
---|
343 | if ( ii < 0 ) continue;
|
---|
344 | if ( ii >= lines ) break;
|
---|
345 | for ( jj = j-k; jj <= j+k; jj++ ) {
|
---|
346 | if ( jj < 0 ) continue;
|
---|
347 | if ( jj >= samps ) continue;
|
---|
348 | if ( *(image4+ii*samps+jj) != 0 ) goto k_nowset;
|
---|
349 | }
|
---|
350 | }
|
---|
351 | }
|
---|
352 |
|
---|
353 | k_nowset:
|
---|
354 | k = k / 4; if ( k < 1 ) k = 1; /* Errrrr. Make it fourth size */
|
---|
355 | sum = 0;
|
---|
356 | for ( ii = i-k; ii <= i+k; ii++ ) {
|
---|
357 | if ( ii < 0 ) iii = -1 - ii; else iii = ii;
|
---|
358 | if ( ii >= lines ) iii = lines - (ii - lines + 1);
|
---|
359 | for ( jj = j-k; jj <= j+k; jj++ ) {
|
---|
360 | if ( jj < 0 ) jjj = -1 - jj; else jjj = jj;
|
---|
361 | if ( jj >= samps ) jjj = samps - (jj - samps + 1);
|
---|
362 | sum += *(image2+samps*iii+jjj) ;
|
---|
363 | }
|
---|
364 | }
|
---|
365 | k = (k*2)+1;
|
---|
366 | *(image3+samps*i+j) = ( sum / k / k ) ;//+ 0.5;
|
---|
367 | }
|
---|
368 |
|
---|
369 | #ifdef _ISSM_DEBUG_
|
---|
370 | if ( !(i%100) ){
|
---|
371 | fprintf(stdout, "\b\b\b\b\b\b%5ld ", i ); /* Count lines on output screen */
|
---|
372 | fflush(stdout);
|
---|
373 | }
|
---|
374 | #endif
|
---|
375 | }
|
---|
376 |
|
---|
377 | #ifdef _ISSM_DEBUG_
|
---|
378 | fprintf(stdout, "\b\b\b\b\b\b%5ld ", lines );
|
---|
379 | fflush(stdout);
|
---|
380 | #endif
|
---|
381 |
|
---|
382 |
|
---|
383 | there2:
|
---|
384 |
|
---|
385 |
|
---|
386 | /*Allocate output image: */
|
---|
387 | imageout=(double*)xmalloc(samps*lines*sizeof(double));
|
---|
388 | memcpy(imageout,image3,lines*samps*sizeof(double));
|
---|
389 |
|
---|
390 | time(&t2);
|
---|
391 | #ifdef _ISSM_DEBUG_
|
---|
392 | printf ( "\n\nEnd "); printf( ctime(&t2) );
|
---|
393 | printf( "\n Total time: ");
|
---|
394 | printf( "%4.2f minutes. \n", difftime(t2,t1)/60 );
|
---|
395 | #endif
|
---|
396 |
|
---|
397 | #ifdef _DEBUG2_
|
---|
398 | printf( "\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b" );
|
---|
399 | printf("Number of zeroes remaining: 0\n\n");
|
---|
400 | printf ( "\n");
|
---|
401 | #endif
|
---|
402 |
|
---|
403 | end:
|
---|
404 |
|
---|
405 | #ifdef _ISSM_DEBUG_
|
---|
406 | printf( "Done.\a\n" );
|
---|
407 | #endif
|
---|
408 |
|
---|
409 | /*Assign output pointers: */
|
---|
410 | *pimageout=imageout;
|
---|
411 |
|
---|
412 | return 1;
|
---|
413 |
|
---|
414 | }
|
---|