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