def wiener(im, mysize=None, noise=None): """Perform a Wiener filter on an N-dimensional array. Apply a Wiener filter to the N-dimensional array `im`. Args: im (cupy.ndarray): An N-dimensional array. mysize (int or cupy.ndarray, optional): A scalar or an N-length list giving the size of the Wiener filter window in each dimension. Elements of mysize should be odd. If mysize is a scalar, then this scalar is used as the size in each dimension. noise (float, optional): The noise-power to use. If None, then noise is estimated as the average of the local variance of the input. Returns: cupy.ndarray: Wiener filtered result with the same shape as `im`. .. seealso:: :func:`scipy.signal.wiener` """ if im.dtype.kind == 'c': # TODO: adding support for complex types requires ndimage filters # to support complex types (which they could easily if not for the # scipy compatibility requirement of forbidding complex and using # float64 intermediates) raise TypeError("complex types not currently supported") if mysize is None: mysize = 3 mysize = _util._fix_sequence_arg(mysize, im.ndim, 'mysize', int) im = im.astype(float, copy=False) # Estimate the local mean local_mean = filters.uniform_filter(im, mysize, mode='constant') # Estimate the local variance local_var = filters.uniform_filter(im * im, mysize, mode='constant') local_var -= local_mean * local_mean # Estimate the noise power if needed. if noise is None: noise = local_var.mean() # Perform the filtering res = im - local_mean res *= 1 - noise / local_var res += local_mean return cupy.where(local_var < noise, local_mean, res)
def wiener(im, mysize=None, noise=None): """Perform a Wiener filter on an N-dimensional array. Apply a Wiener filter to the N-dimensional array `im`. Args: im (cupy.ndarray): An N-dimensional array. mysize (int or cupy.ndarray, optional): A scalar or an N-length list giving the size of the Wiener filter window in each dimension. Elements of mysize should be odd. If mysize is a scalar, then this scalar is used as the size in each dimension. noise (float, optional): The noise-power to use. If None, then noise is estimated as the average of the local variance of the input. Returns: cupy.ndarray: Wiener filtered result with the same shape as `im`. .. seealso:: :func:`scipy.signal.wiener` """ if mysize is None: mysize = 3 mysize = _util._fix_sequence_arg(mysize, im.ndim, 'mysize', int) im = im.astype(cupy.complex128 if im.dtype.kind == 'c' else cupy.float64, copy=False) # Estimate the local mean local_mean = filters.uniform_filter(im, mysize, mode='constant') # Estimate the local variance local_var = filters.uniform_filter(im * im, mysize, mode='constant') local_var -= local_mean * local_mean # Estimate the noise power if needed. if noise is None: noise = local_var.mean() # Perform the filtering res = im - local_mean res *= 1 - noise / local_var res += local_mean return cupy.where(local_var < noise, local_mean, res)
def diffuse_uniform(self, size=3, mode="wrap"): """Pheromones get distributed using uniform smoothing. This can lead to nice artefacts, but also to diagonal drift at high values for size (?)""" self.trail_map = uniform_filter(self.trail_map, size=size, mode=mode)
def diffuse_uniform(self, size=3, mode="wrap"): """Pheromones get distributed using uniform smoothing. """ self.trail_map = uniform_filter(self.trail_map, size=size, mode=mode)