python - Python ndimage generic_filter 的条件逻辑

标签 python python-3.x numpy scipy ndimage

我正在尝试编写一个 python 函数来删除 2D 图像数据中的热像素。我正在尝试创建一个函数,该函数将获取 2D 数组中每个元素周围的邻居的平均值,并且如果该元素的值超过其邻居的平均值特定量(例如 3 sigma),则有条件地覆盖该元素。这就是我所在的地方:

def myFunction(values):
    if np.mean(values) + 3*np.std(values) < origin:
        return np.mean(values)

footprint = np.array([[1,1,1],
                      [1,0,1],
                      [1,1,1]])
correctedData = ndimage.generic_filter(data, myFunction, footprint = footprint)

上面代码中的“origin”是指示性的。我知道这是不正确的,我只是想展示我想做的事情。有没有办法将当前元素的值传递给 generic_function?

谢谢!

最佳答案

您的足迹没有将中心值传递回您的函数。

我发现使用size(相当于使用足迹中的所有大小)更容易,然后在回调函数中处理所有内容。因此,在您的情况下,我会提取回调函数内的中心值。像这样的事情:

from scipy.ndimage import generic_filter

def despike(values):
    centre = int(values.size / 2)
    avg = np.mean([values[:centre], values[centre+1:]])
    std = np.std([values[:centre], values[centre+1:]])
    if avg + 3 * std < values[centre]:
        return avg
    else:
        return values[centre]

让我们制作一些假数据:

data = np.random.randint(0, 10, (5, 5))
data[2, 2] = 100

这会产生(例如):

array([[  2,   8,   4,   2,   4],
       [  9,   4,   7,   6,   5],
       [  9,   9, 100,   7,   3],
       [  0,   1,   0,   8,   0],
       [  9,   9,   7,   6,   0]])

现在您可以应用过滤器:

correctedData = generic_filter(data, despike, size=3)

这删除了我添加的尖峰:

array([[2, 8, 4, 2, 4],
       [9, 4, 7, 6, 5],
       [9, 9, 5, 7, 3],
       [0, 1, 0, 8, 0],
       [9, 9, 7, 6, 0]])

关于python - Python ndimage generic_filter 的条件逻辑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48751046/

相关文章:

python - 添加到字典列表 - python

python - 我无法打开 Snowsql,因为它出现了类似 ModuleNotFoundError 的错误

python - 从ppt幻灯片中提取所有标题(标题)

python - 在行和列中切片 scipy.sparse.lil_matrix

python - 计算 bool numpy 数组中每行与其他行的相交列数

python - 如何将浮点列表的 2d np.array 转换为浮点的 2d np.array,将列表值堆叠到行

python - 如何反转 sklearn.OneHotEncoder 变换以恢复原始数据?

python - 有没有更高效的方法来排序这个数组?

python - 根据多种条件将列表中的项目替换为其他项目(小列表)

python - raise_(​​) 函数被忽略