使用NumPy数组进行局部均值滤波,其中包含缺失数据

5
我想制作一个本地均值滤波器,用于处理存储为numpy数组的图像。该图像在边缘附近有一些缺失像素,并使用有效掩码(布尔数组)表示。
我可以使用skimage.filters.rank,但我的图像超出了[-1, 1]范围,而scikit-image有这个要求,原因不明。
也可以使用astropy.convolution,但它会插值缺失数据。对于简单的均值而言,没有必要进行插值。只需对有效像素求平均。输入和输出有效掩码相同。
仅将无效像素设置为零不是一个选择,因为它会污染附近有效像素的平均值。
还有this question,但这不是重复问题,因为它询问更通用的卷积(这只是求平均)。

不确定你的方法,但是-1,1的要求根本不是问题。只需将图像缩放到此格式即可。均值计算是浮点数学的概念,而且在某些时候你肯定需要转换(如果你担心信息丢失)。你特别要求这个简单操作,但是inpaint_biharmonic有什么问题吗? - sascha
scikit-image和scipy.ndimage都不支持在滤波器中使用缺失值。尽管如此,可以通过教授scipy.ndimage.generic_filter来实现这一点,并且可以像这里所示的那样快速完成:https://ilovesymposia.com/2017/03/15/prettier-lowlevelcallables-with-numba-jit-and-decorators/ - Stefan van der Walt
1个回答

1
@stefan-van-der-walt所提到的方法是使用scipy.ndimage.generic_filternumpy.nanmean结合起来(目前还未进行速度优化)。
import numpy as np
from scipy.ndimage import generic_filter

def nanmean_filter(input_array, *args, **kwargs):
    """
    Arguments:
    ----------
    input_array : ndarray
        Input array to filter.
    size : scalar or tuple, optional
        See footprint, below
    footprint : array, optional
        Either `size` or `footprint` must be defined.  `size` gives
        the shape that is taken from the input array, at every element
        position, to define the input to the filter function.
        `footprint` is a boolean array that specifies (implicitly) a
        shape, but also which of the elements within this shape will get
        passed to the filter function.  Thus ``size=(n,m)`` is equivalent
        to ``footprint=np.ones((n,m))``.  We adjust `size` to the number
        of dimensions of the input array, so that, if the input array is
        shape (10,10,10), and `size` is 2, then the actual size used is
        (2,2,2).
    output : array, optional
        The `output` parameter passes an array in which to store the
        filter output. Output array should have different name as compared
        to input array to avoid aliasing errors.
    mode : {'reflect', 'constant', 'nearest', 'mirror', 'wrap'}, optional
        The `mode` parameter determines how the array borders are
        handled, where `cval` is the value when mode is equal to
        'constant'. Default is 'reflect'
    cval : scalar, optional
        Value to fill past edges of input if `mode` is 'constant'. Default
        is 0.0
    origin : scalar, optional
        The `origin` parameter controls the placement of the filter.
        Default 0.0.

    See also:
    ---------
    scipy.ndimage.generic_filter
    """
    return generic_filter(input_array, function=np.nanmean, *args, **kwargs)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接