33 #ifndef __INCLUDE_MIST_THRESHOLD__
34 #define __INCLUDE_MIST_THRESHOLD__
37 #ifndef __INCLUDE_MIST_H__
41 #ifndef __INCLUDE_MIST_LIMITS__
73 template <
class Array >
74 typename Array::value_type
threshold(
const Array &in,
double ratio )
76 typedef typename Array::size_type size_type;
77 typedef typename Array::value_type value_type;
81 return( value_type( 0 ) );
84 value_type min = in[ 0 ];
85 value_type max = in[ 0 ];
89 for( i = 1 ; i < in.size( ) ; i++ )
95 else if( max < in[ i ] )
101 size_type level =
static_cast< size_type
>( max - min ) + 1;
102 size_type *hist =
new size_type[ level ];
103 size_type N = in.size( );
105 for( i = 0 ; i < level ; i++ )
109 for( i = 0 ; i < N ; i++ )
111 hist[
static_cast< size_type
>( in[ i ] - min ) ]++;
114 size_type pix_num = 0;
117 while( ( pix_num * 100.0 ) /
static_cast< double >( N ) < ratio )
119 pix_num += hist[ th ];
125 return( static_cast< value_type >( th + min ) );
138 template <
class Array,
class Mask >
139 typename Array::value_type
threshold(
const Array &in,
const Mask &mask,
double ratio )
141 typedef typename Array::size_type size_type;
142 typedef typename Array::value_type value_type;
146 return( value_type( 0 ) );
152 size_type i, count = 0;
154 for( i = 0 ; i < in.size( ) ; i++ )
172 return( value_type( 0 ) );
175 size_type level =
static_cast< size_type
>( max - min ) + 1;
176 size_type *hist =
new size_type[ level ];
178 for( i = 0 ; i < level ; i++ )
182 for( i = 0 ; i < in.size( ) ; i++ )
186 hist[
static_cast< size_type
>( in[ i ] - min ) ]++;
190 size_type pix_num = 0;
193 while( ( pix_num * 100.0 ) /
static_cast< double >( count ) < ratio )
195 pix_num += hist[ th ];
201 return( static_cast< value_type >( th + min ) );
208 namespace discriminant_analysis
216 template <
class T,
class Allocator >
224 return( value_type( 0 ) );
227 value_type min = in[ 0 ];
228 value_type max = in[ 0 ];
232 for( i = 1 ; i < in.
size( ) ; i++ )
238 else if( max < in[ i ] )
244 size_type level =
static_cast< size_type
>( max - min ) + 1;
246 double *p =
new double[ level ];
248 double myuT, sig, max_sig = 0.0;
250 size_type N = in.
size( );
251 for( k = 0 ; k < level ; k++ )
255 for( k = 0 ; k < N ; k++ )
257 p[
static_cast< size_type
>( in[ k ] - min ) ]++;
259 for( k = 0 ; k < level ; k++ )
261 p[ k ] /=
static_cast< double >( N );
265 for( k = 0 ; k < level ; k++ )
273 max_sig = ( myuT * omg - myu ) * ( myuT * omg - myu ) / ( omg * ( 1.0 - omg ) );
274 for( k = 1 ; k < level ; k++ )
277 myu = myu + k * p[ k ];
278 sig = ( myuT * omg - myu ) * ( myuT * omg - myu ) / ( omg * ( 1.0 - omg ) );
288 return( static_cast< value_type >( max_k + min ) );
298 template <
class T1,
class Allocator1,
class T2,
class Allocator2 >
306 return( value_type( 0 ) );
312 size_type i, k, count = 0;
314 for( i = 0 ; i < in.
size( ) ; i++ )
332 return( value_type( 0 ) );
335 size_type level =
static_cast< size_type
>( max - min ) + 1;
337 double *p =
new double[ level ];
339 double myuT, sig, max_sig = 0.0;
341 for( k = 0 ; k < level ; k++ )
345 for( k = 0 ; k < in.
size( ) ; k++ )
349 p[
static_cast< size_type
>( in[ k ] - min ) ]++;
352 for( k = 0 ; k < level ; k++ )
354 p[ k ] /=
static_cast< double >( count );
358 for( k = 0 ; k < level ; k++ )
366 max_sig = ( myuT * omg - myu ) * ( myuT * omg - myu ) / ( omg * ( 1.0 - omg ) );
367 for( k = 1 ; k < level ; k++ )
370 myu = myu + k * p[ k ];
371 sig = ( myuT * omg - myu ) * ( myuT * omg - myu ) / ( omg * ( 1.0 - omg ) );
381 return( static_cast< value_type >( max_k + min ) );
396 template <
class T,
class Allocator >
408 return( value_type( 0 ) );
412 return( value_type( 0 ) );
415 if( in.
width( ) < x + w )
419 if( in.
height( ) < y + h )
424 value_type min = in( x, y );
425 value_type max = min;
429 for( j = y ; j < y + h ; j++ )
431 for( i = x ; i < x + w ; i++ )
433 if( min > in( i, j ) )
437 else if( max < in( i, j ) )
444 size_type level =
static_cast< size_type
>( max - min ) + 1;
446 double *p =
new double[ level ];
448 double myuT, sig, max_sig = 0.0;
450 for( k = 0 ; k < level ; k++ )
455 for( j = y ; j < y + h ; j++ )
457 for( i = x ; i < x + w ; i++ )
459 p[
static_cast< size_type
>( in( i, j ) - min ) ]++;
464 for( k = 0 ; k < level ; k++ )
466 p[ k ] /=
static_cast< double >( N );
470 for( k = 0 ; k < level ; k++ )
478 max_sig = ( myuT * omg - myu ) * ( myuT * omg - myu ) / ( omg * ( 1.0 - omg ) );
479 for( k = 1 ; k < level ; k++ )
482 myu = myu + k * p[ k ];
483 sig = ( myuT * omg - myu ) * ( myuT * omg - myu ) / ( omg * ( 1.0 - omg ) );
493 return( static_cast< value_type >( max_k + min ) );
505 #endif // __INCLUDE_MIST_THRESHOLD__