Source code for numpy_ipps.filtering.median

"""FilterMedian Functions."""
import logging as _logging

import numpy as _numpy
import scipy.ndimage as _ndimage

import numpy_ipps._detail.debug as _debug
import numpy_ipps._detail.dispatch as _dispatch
import numpy_ipps._detail.metaclass.selector as _selector
import numpy_ipps.policies
import numpy_ipps.utils


[docs]class FilterMedian: """FilterMedian Function.""" __slots__ = ( "_ipps_backend", "_ipps_mask_size", "_ipps_dlySrc", "_ipps_dlyDst", "_ipps_mem_buffer", "_numpy_shift", ) dtype_candidates = numpy_ipps.policies.no_complex_candidates _ipps_kind = _selector.Kind.UNARY def __init__(self, size, dtype, continuous=False): self._ipps_mask_size = numpy_ipps.utils.cast("int", 2 * size + 1) self._numpy_shift = size if dtype == _numpy.float32: ipps_type = numpy_ipps.utils.cast("int", 13) elif dtype == _numpy.float64: ipps_type = numpy_ipps.utils.cast("int", 19) else: raise RuntimeError("Unknown dtype {}".format(dtype)) if continuous: self._ipps_dlySrc = numpy_ipps.utils.ndarray( _numpy.zeros(2 * size, dtype=dtype) ) self._ipps_dlyDst = numpy_ipps.utils.ndarray( _numpy.empty(2 * size, dtype=dtype) ) else: self._ipps_dlySrc = numpy_ipps.utils.ndarray() self._ipps_dlyDst = numpy_ipps.utils.ndarray() ipps_buffer_size = numpy_ipps.utils.new("int*") ipps_median_getsize = _dispatch.ipps_function( "FilterMedianGetBufferSize", ( "int", "int", "int*", ), ) numpy_ipps.status = ipps_median_getsize( self._ipps_mask_size, ipps_type, ipps_buffer_size, ) _debug.assert_status( numpy_ipps.status, message="Get FilterMedian size", name=__name__ ) self._ipps_mem_buffer = numpy_ipps.utils.ndarray( _numpy.empty(ipps_buffer_size[0], dtype=_numpy.uint8) ) _logging.getLogger(__name__).info( "FilterMedian allocations: working buffer {}o.".format( ipps_buffer_size[0] ) ) self._ipps_backend = _dispatch.ipps_function( "FilterMedian", ( "void*", "void*", "int", "int", "void*", "void*", "void*", ), dtype, ) def __call__(self, src, dst): numpy_ipps.status = self._ipps_backend( src.cdata, dst.cdata, dst.size, self._ipps_mask_size, self._ipps_dlySrc.cdata, self._ipps_dlyDst.cdata, self._ipps_mem_buffer.cdata, ) assert ( numpy_ipps.status == 0 ), "DEBUG: Bad Intel IPP Signal status {}".format(numpy_ipps.status) numpy_ipps.utils.swap_ndarray(self._ipps_dlySrc, self._ipps_dlyDst) def _numpy_backend(self, src, dst): _ndimage.median_filter( src.ndarray, size=int(self._ipps_mask_size), output=dst.ndarray, mode="nearest", origin=self._numpy_shift, )
[docs]class FilterMedian_I: """FilterMedian_I Function.""" __slots__ = ( "_ipps_backend", "_ipps_mask_size", "_ipps_dlySrc", "_ipps_dlyDst", "_ipps_mem_buffer", "_numpy_shift", ) dtype_candidates = numpy_ipps.policies.no_complex_candidates _ipps_kind = _selector.Kind.UNARY def __init__(self, size, dtype, continuous=False): self._ipps_mask_size = numpy_ipps.utils.cast("int", 2 * size + 1) self._numpy_shift = size if dtype == _numpy.float32: ipps_type = numpy_ipps.utils.cast("int", 13) elif dtype == _numpy.float64: ipps_type = numpy_ipps.utils.cast("int", 19) else: raise RuntimeError("Unknown dtype {}".format(dtype)) if continuous: self._ipps_dlySrc = numpy_ipps.utils.ndarray( _numpy.zeros(2 * size, dtype=dtype) ) self._ipps_dlyDst = numpy_ipps.utils.ndarray( _numpy.empty(2 * size, dtype=dtype) ) else: self._ipps_dlySrc = numpy_ipps.utils.ndarray() self._ipps_dlyDst = numpy_ipps.utils.ndarray() ipps_buffer_size = numpy_ipps.utils.new("int*") ipps_median_getsize = _dispatch.ipps_function( "FilterMedianGetBufferSize", ( "int", "int", "int*", ), ) numpy_ipps.status = ipps_median_getsize( self._ipps_mask_size, ipps_type, ipps_buffer_size, ) _debug.assert_status( numpy_ipps.status, message="Get FilterMedian size", name=__name__ ) self._ipps_mem_buffer = numpy_ipps.utils.ndarray( _numpy.empty(ipps_buffer_size[0], dtype=_numpy.uint8) ) _logging.getLogger(__name__).info( "FilterMedian allocations: working buffer {}o.".format( ipps_buffer_size[0] ) ) self._ipps_backend = _dispatch.ipps_function( "FilterMedian_I", ( "void*", "int", "int", "void*", "void*", "void*", ), dtype, ) def __call__(self, src_dst): numpy_ipps.status = self._ipps_backend( src_dst.cdata, src_dst.size, self._ipps_mask_size, self._ipps_dlySrc.cdata, self._ipps_dlyDst.cdata, self._ipps_mem_buffer.cdata, ) assert ( numpy_ipps.status == 0 ), "DEBUG: Bad Intel IPP Signal status {}".format(numpy_ipps.status) numpy_ipps.utils.swap_ndarray(self._ipps_dlySrc, self._ipps_dlyDst) def _numpy_backend(self, src_dst): _ndimage.median_filter( src_dst.ndarray, size=int(self._ipps_mask_size), output=src_dst.ndarray, mode="nearest", origin=self._numpy_shift, )