35 #ifndef AIMS_SIGNALFILTER_VFILTER_H
36 #define AIMS_SIGNALFILTER_VFILTER_H
69 template<
class T >
inline
77 res = nonOptimized( d );
89 template<
class T >
inline
92 int x, y, z, t, i, j, k, index;
93 double sum, sum2, varmin, var[8], moy[8];
97 double t3 = (double)( _size * _size * _size );
107 for ( t=0; t<dt; t++ )
108 for ( z=0; z<dz; z++ )
109 for ( y=0; y<dy; y++ )
110 for ( x=0; x<dx; x++ )
113 for ( i=0; i<8; i++ )
120 if ( ( x >= tm1 ) && ( y >= tm1 ) && ( z >= tm1 ) )
123 for ( k=z-tm1; k<z+1; k++ )
124 for ( j=y-tm1; j<y+1; j++ )
125 for ( i=x-tm1; i<x+1; i++ )
127 temp = d( i, j, k, t );
129 sum2 += (double)( temp * temp );
132 var[ 0 ] = sum2 - (
sum *
sum ) / t3;
137 if ( ( x >= tm1 ) && ( y < dy-tm1 ) && ( z >= tm1 ) )
140 for ( k=z-tm1; k<z+1; k++ )
141 for ( j=y; j<y+_size; j++ )
142 for ( i=x-tm1; i<x+1; i++ )
144 temp = d( i, j, k, t );
146 sum2 += (double)( temp * temp );
149 var[ 1 ] = sum2 - (
sum *
sum ) / t3;
154 if ( ( x < dx-tm1 ) && ( y < dy-tm1 ) && ( z >= tm1 ) )
157 for ( k=z-tm1; k<z+1; k++ )
158 for ( j=y; j<y+_size; j++ )
159 for ( i=x; i<x+_size; i++ )
161 temp = d( i, j, k, t );
163 sum2 += (double)( temp * temp );
166 var[ 2 ] = sum2 - (
sum *
sum ) / t3;
171 if ( ( x < dx-tm1 ) && ( y >= tm1 ) && ( z >= tm1 ) )
174 for ( k=z-tm1; k<z+1; k++ )
175 for ( j=y-tm1; j<y+1; j++ )
176 for ( i=x; i<x+_size; i++ )
178 temp = d( i, j, k, t );
180 sum2 += (double)( temp * temp );
183 var[ 3 ] = sum2 - (
sum *
sum ) / t3;
188 if ( ( x >= tm1 ) && ( y >= tm1 ) && ( z < dz-tm1 ) )
191 for ( k=z; k<z+_size; k++ )
192 for ( j=y-tm1; j<y+1; j++ )
193 for ( i=x-tm1; i<x+1; i++ )
195 temp = d( i, j, k, t );
197 sum2 += (double)( temp * temp );
200 var[ 4 ] = sum2 - (
sum *
sum ) / t3;
205 if ( ( x >= tm1 ) && ( y < dy-tm1 ) && ( z < dz-tm1 ) )
208 for ( k=z; k<z+_size; k++ )
209 for ( j=y; j<y+_size; j++ )
210 for ( i=x-tm1; i<x+1; i++ )
212 temp = d( i, j, k, t );
214 sum2 += (double)( temp * temp );
217 var[ 5 ] = sum2 - (
sum *
sum ) / t3;
222 if ( ( x < dx-tm1 ) && ( y < dy-tm1 ) && ( z < dz-tm1 ) )
225 for ( k=z; k<z+_size; k++ )
226 for ( j=y; j<y+_size; j++ )
227 for ( i=x; i<x+_size; i++ )
229 temp = d( i, j, k, t );
231 sum2 += (double)( temp * temp );
234 var[ 6 ] = sum2 - (
sum *
sum ) / t3;
239 if ( ( x < dx-tm1 ) && ( y >= tm1 ) && ( z < dz-tm1 ) )
242 for ( k=z; k<z+_size; k++ )
243 for ( j=y-tm1; j<y+1; j++ )
244 for ( i=x; i<x+_size; i++ )
246 temp = d( i, j, k, t );
248 sum2 += (double)( temp * temp );
251 var[ 7 ] = sum2 - (
sum *
sum ) / t3;
258 for ( i=1; i<8; i++ )
259 if ( var[ i ] < varmin )
266 res( x, y, z, t ) = (T)moy[ index ];
274 template<
class T >
inline
277 int i, j, k, x, y, z, loc;
278 double somme, carre, somme1, carre1, vars, *pvar, moyenne, temp;
283 double size2 = (double)( _size * _size * _size );
290 for ( z=_size; z--; )
292 for ( x=dx; x--; ) table( x, y, z ) = -1.0;
294 for (z=0; z+tm1<dz; z++ )
296 i = ( z + tm1 ) % _size;
299 for ( y=0; y<dy; y++ )
300 for ( x=0; x<dx; x++ ) table( x, y, i ) = -1.0;
304 for ( k=z; k<z+_size; k++ )
305 for ( j=0; j<_size; j++ )
306 for ( i=0; i<_size; i++ )
308 temp = (double)d( i, j, k );
310 carre += temp * temp;
313 vars = carre - somme * somme / size2;
314 moyenne = somme / size2;
318 pvar = &table( 0, 0, z % _size );
319 if ( ( vars < *pvar ) || ( *pvar == -1.0 ) )
321 vf( 0, 0, z ) = (T)moyenne;
324 pvar = &table( 0, tm1, z % _size );
325 if ( ( vars < *pvar ) || ( *pvar == -1.0 ) )
327 vf( 0, tm1, z ) = (T)moyenne;
330 pvar = &table( tm1, 0, z % _size );
331 if ( ( vars < *pvar ) || ( *pvar == -1.0 ) )
333 vf( tm1, 0, z ) = (T)moyenne;
336 pvar = &table( tm1, tm1, z % _size );
337 if ( (vars < *pvar ) || ( *pvar == -1.0 ) )
339 vf( tm1, tm1, z ) = (T)moyenne;
342 pvar = &table( 0, 0, ( z + tm1 ) % _size );
343 if ( ( vars < *pvar ) || ( *pvar == -1.0 ) )
345 vf( 0, 0, z + tm1 ) = (T)moyenne;
348 pvar = &table( 0, tm1, ( z + tm1 ) % _size );
349 if ( ( vars < *pvar ) || ( *pvar == -1.0 ) )
351 vf( 0, tm1, z + tm1 ) = (T)moyenne;
354 pvar = &table( tm1, 0, ( z + tm1 ) % _size );
355 if ( ( vars < *pvar ) || ( *pvar == -1.0 ) )
357 vf( tm1, 0, z + tm1 ) = (T)moyenne;
360 vf( tm1, tm1, z + tm1 ) = (T)moyenne;
361 table( tm1, tm1, ( z + tm1 ) % _size ) = vars;
364 for ( x=1; x+tm1<dx; x++ )
366 for ( k=z; k<z+_size; k++ )
367 for ( j=0; j<_size; j++ )
370 temp = (double)d( loc, j, k );
372 carre -= temp * temp;
374 temp = (double)d( loc, j, k );
376 carre += temp * temp;
378 vars = carre - somme * somme / size2;
379 moyenne = somme / size2;
381 pvar = &table( x, 0, z % _size );
382 if ( ( vars < *pvar ) || ( *pvar == -1.0 ) )
384 vf( x, 0, z ) = (T)moyenne;
387 pvar = &table( x, tm1, z % _size );
388 if ( ( vars < *pvar ) || ( *pvar == -1.0 ) )
390 vf( x, tm1, z ) = (T)moyenne;
393 pvar = &table( x + tm1, 0, z % _size );
394 if ( ( vars < *pvar ) || ( *pvar == -1.0 ) )
396 vf( x + tm1, 0, z ) = (T)moyenne;
399 pvar = &table( x + tm1, tm1, z % _size );
400 if ( ( vars < *pvar ) || ( *pvar == -1.0 ) )
402 vf( x + tm1, tm1, z ) = (T)moyenne;
405 pvar = &table( x, 0, ( z + tm1 ) % _size );
406 if ( ( vars < *pvar ) || ( *pvar == -1.0 ) )
408 vf( x, 0, z + tm1 ) = (T)moyenne;
411 pvar = &table( x, tm1, ( z + tm1 ) % _size );
412 if ( ( vars < *pvar ) || ( *pvar == -1.0 ) )
414 vf( x, tm1, z + tm1 ) = (T)moyenne;
417 pvar = &table( x + tm1, 0, ( z + tm1 ) % _size );
418 if ( ( vars < *pvar ) || ( *pvar == -1.0 ) )
420 vf( x + tm1, 0, z + tm1 ) = (T)moyenne;
423 vf( x + tm1, tm1, z + tm1 ) = (T)moyenne;
424 table( x + tm1, tm1, ( z + tm1 ) % _size ) = vars;
428 for ( y=1; y+tm1<dy; y++ )
434 for ( k=z; k<z+_size; k++)
435 for ( i=0; i<_size; i++)
438 temp = (double)d( i, loc, k );
440 carre -= temp * temp;
442 temp = (double)d( i, loc, k );
444 carre += temp * temp;
447 vars = carre - somme * somme / size2;
448 moyenne = somme / size2;
452 pvar = &table( 0, y, z % _size );
453 if ( ( vars < *pvar ) || ( *pvar == -1.0 ) )
455 vf( 0, y, z ) = (T)moyenne;
458 pvar = &table( 0, y + tm1, z % _size );
459 if ( ( vars < *pvar ) || ( *pvar == -1.0 ) )
461 vf( 0, y + tm1, z ) = (T)moyenne;
464 pvar = &table( tm1, y, z % _size );
465 if ( ( vars < *pvar ) || ( *pvar == -1.0 ) )
467 vf( tm1, y, z ) = (T)moyenne;
470 pvar = &table( tm1, y + tm1, z % _size );
471 if ( ( vars < *pvar ) || ( *pvar == -1.0 ) )
473 vf( tm1, y + tm1, z ) = (T)moyenne;
476 pvar = &table( 0, y, ( z + tm1 ) % _size );
477 if ( ( vars < *pvar ) || ( *pvar == -1.0 ) )
479 vf( 0, y, z + tm1 ) = (T)moyenne;
482 pvar = &table( 0, y + tm1, ( z + tm1 ) % _size );
483 if ( ( vars < *pvar ) || ( *pvar == -1.0 ) )
485 vf( 0, y + tm1, z + tm1 ) = (T)moyenne;
488 pvar = &table( tm1, y, ( z + tm1 ) % _size );
489 if ( ( vars < *pvar ) || ( *pvar == -1.0 ) )
491 vf( tm1, y, z + tm1 ) = (T)moyenne;
494 vf( tm1, y + tm1, z + tm1 ) = (T)moyenne;
495 table( tm1, y + tm1, ( z + tm1 ) % _size ) = vars;
498 for ( x=1; x+tm1<dx; x++ )
500 for ( k=z; k<z+_size; k++ )
501 for ( j=y; j<y+_size; j++ )
504 temp = (double)d( loc, j, k);
506 carre -= temp * temp;
508 temp = (double)d( loc, j, k);
510 carre += temp * temp;
513 vars = carre - somme * somme / size2;
514 moyenne = somme / size2;
516 pvar = &table( x, y, z % _size );
517 if ( ( vars < *pvar ) || ( *pvar == -1.0 ) )
519 vf( x, y, z ) = (T)moyenne;
522 pvar = &table( x, y + tm1, z % _size );
523 if ( ( vars < *pvar ) || ( *pvar == -1.0 ) )
525 vf( x, y + tm1, z ) = (T)moyenne;
528 pvar = &table( x + tm1, y, z % _size );
529 if ( ( vars < *pvar ) || ( *pvar == -1.0 ) )
531 vf( x + tm1, y, z ) = (T)moyenne;
534 pvar = &table( x + tm1, y + tm1, z % _size );
535 if ( ( vars < *pvar ) || ( *pvar == -1.0 ) )
537 vf( x + tm1, y + tm1, z ) = (T)moyenne;
540 pvar = &table( x, y, ( z + tm1 ) % _size );
541 if ( ( vars < *pvar ) || ( *pvar == -1.0 ) )
543 vf( x, y, z + tm1 ) = (T)moyenne;
546 pvar = &table( x, y + tm1, ( z + tm1 ) % _size );
547 if ( ( vars < *pvar ) || ( *pvar == -1.0 ) )
549 vf( x, y + tm1, z + tm1 ) = (T)moyenne;
552 pvar = &table( x + tm1, y, ( z + tm1 ) % _size );
553 if ( ( vars < *pvar ) || ( *pvar == -1.0 ) )
555 vf( x + tm1, y, z + tm1 ) = (T)moyenne;
558 vf( x + tm1, y + tm1, z + tm1 ) = (T)moyenne;
559 table( x + tm1, y + tm1, ( z + tm1 ) % _size ) = vars;
The template class to perform a V-filter.
carto::VolumeRef< T > doit(carto::VolumeRef< T > &)
AimsVFilter(int s=2, VFilterType t=Optimized)
std::vector< float > getVoxelSize() const
DataTypeTraits< T >::LongType sum(const Volume< T > &vol)