为了账号安全,请及时绑定邮箱和手机立即绑定

没有循环的python中的均值过滤器

没有循环的python中的均值过滤器

红糖糍粑 2022-10-05 17:01:39
我被要求在具有给定内核的一维数组上创建一个 mean_filter 函数,假设填充为零。均值滤波器是一种旨在去除噪声的算法。它需要一个数组,一个内核(比如 K),并用周围 K 值的平均值替换数组的每个值,包括本身在内。该算法用于图像处理。我能够做到这一点-def mean_filter(arr, k):    # applies mean filter to 1-d array with the kernel size 2k+1 . Write your code here    p=len(arr)    arr2=np.zeros(2*k+p, dtype=float)    arr3=np.zeros(2*k+p, dtype=float)    arr4=np.zeros(p, dtype=float)    for i in range(p):        arr2[k+i]=arr[i]    for i in range(k,k+p):        sum=0        for j in range(-k,k+1):            sum+=arr2[i+j]        arr3[i]=sum/float(2*k+1)    for i in range(p):        arr4[i]=arr3[k+i]    return arr4但是他们对我的期望是在没有任何循环的情况下做到这一点。指令显示-“这个任务应该在没有任何类型的循环、理解或函数(如 np.vectorize 等)的情况下完成。不要为此任务使用内置卷积函数“我真的不知道如何做到这一点。你能建议点什么吗?线索将不胜感激。
查看完整描述

3 回答

?
拉风的咖菲猫

TA贡献1995条经验 获得超2个赞

举例:


import numpy as np

k=2

kern=np.ones(2*k+1)/(2*k+1)

arr=np.random.random((10))

out=np.convolve(arr,kern, mode='same')


查看完整回答
反对 回复 2022-10-05
?
慕无忌1623718

TA贡献1744条经验 获得超4个赞

我找到了一个解决方案,该解决方案的灵感来自我在尝试实现不同的边缘行为时偶然发现的 matlab 函数,而在均值过滤中没有填充:https ://www.mathworks.com/matlabcentral/fileexchange/23287-smooth2a 。它适用于矩阵乘法,不涉及循环或卷积。使用一维数组,它会给出这样的结果:


import scipy.sparse

import numpy as np


def mean_filter(arr, k):

    p = len(arr)

    diag_offset = np.linspace(-(k//2), k//2, k, dtype=int)

    eL = scipy.sparse.diags(np.ones((k, p)), offsets=diag_offset, shape=(p, p))

    nrmlize = eL @ np.ones_like(arr)

    return (eL @ arr) / nrmlize

它的工作原理是创建一个对角线与内核大小一样多的矩阵,然后对数组进行点积。结果是一个数组,其中每个元素都是内核上原始数组元素的总和。基本上,这相当于卷积。最后,您通过内核大小对该总和进行归一化。


需要注意的一点是,在您无法构建完整内核的阵列边缘,使用了适合您的阵列的尽可能多的内核(这就是为什么您不能在之后仅通过标量进行归一化)。


该解决方案还可以扩展到处理多维数组。


查看完整回答
反对 回复 2022-10-05
?
慕神8447489

TA贡献1780条经验 获得超1个赞

def meanfilt (x, k):

    """Apply a length-k mean filter to a 1D array x.

    Boundaries are extended by repeating endpoints.

    """

    

    import numpy as np


    assert k % 2 == 1, "Mean filter length must be odd."

    assert x.ndim == 1, "Input must be one-dimensional."

    

    k2 = (k - 1) // 2

    y = np.zeros ((len (x), k), dtype=x.dtype)

    y[:,k2] = x

    for i in range (k2):

        j = k2 - i

        y[j:,i] = x[:-j]

        y[:j,i] = x[0]

        y[:-j,-(i+1)] = x[j:]

        y[-j:,-(i+1)] = x[-1]

    return np.mean (y, axis=1)

注意:答案是从回购中挑选的


查看完整回答
反对 回复 2022-10-05
  • 3 回答
  • 0 关注
  • 91 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信