Source code for ClearMap.ImageProcessing.Clipping.Clipping
"""
Clipping
========
Module to compute clipped images
Usefull to sace memory in large data sets
"""
__author__    = 'Christoph Kirst <christoph.kirst.ck@gmail.com>'
__license__   = 'GPLv3 - GNU General Pulic License v3 (see LICENSE.txt)'
__copyright__ = 'Copyright © 2020 by Christoph Kirst'
__webpage__   = 'http://idisco.info'
__download__  = 'http://www.github.com/ChristophKirst/ClearMap2'
import numpy as np
import pyximport;
pyximport.install(setup_args={"include_dirs":np.get_include()}, 
                  reload_support=True)
import ClearMap.ParallelProcessing.DataProcessing.ArrayProcessing as ap
from . import ClippingCode as code
###############################################################################
### Clipping
###############################################################################
[docs]
def clip(source, sink = None, clip_min = None, clip_max = None, clip_norm = None, processes = None, verbose = False):
  """Clip and normalize data.
  Arguments
  ---------
  source : array
      Input source.
  sink : array, dtype or None
      output sink or output data type, if None, a new array is allocated.
  clip_min : number
      Minimal number to clip source data to.
  clip_max : number
      Maximal number to clip source data to.
  clip_norm : number
      Normalization constant.
  Returns
  -------
  sink : array
      Clipped output.
  """
  processes, timer = ap.initialize_processing(verbose=verbose, processes=processes, function='clip');
  
  source, source_buffer = ap.initialize_source(source);
  if source.ndim != 3:
    raise ValueError('Source assumed to be 3d found %dd!' % source.ndim);
  
  if clip_min is None:
    clip_min = ap.io.min_value(source);
  
  if clip_max is None:
    clip_max = ap.io.max_value(source);
  
  if clip_norm is None:
    clip_norm = clip_max - clip_min;
  sink, sink_buffer = ap.initialize_sink(sink = sink, source = source);
                                            
  code.clip(source_buffer, sink_buffer, clip_min, clip_max, clip_norm, processes);
  
  return sink; 
 
###############################################################################
### Tests
###############################################################################
def _test():
  import numpy as np
  import ClearMap.Utils.Timer as tmr
  import ClearMap.ImageProcessing.Clipping.Clipping as clp
  
  data = np.random.rand(1000,1000,2000);
  
  for p in [1, 10, None]:
    print('Clipping: processes = %r' % p);
    timer = tmr.Timer();
    clipped = clp.clip(data, clip_max = 0.5, processes = p);  
    timer.print_elapsed_time('Clipping');