如何在Python中计算大矩阵每个坐标的高效局部均值(均值滤波)

3 投票
2 回答
3763 浏览
提问于 2025-04-16 06:26

我有一个很大的矩阵,大小是4000x4000。
我需要计算这个矩阵中每个位置(x,y)周围11x11的局部平均值。
一般来说,这个过程应该是这样的:

for x in range(4000)
  for y in range(4000)
    b[x,y]=mean(a[x-5:x+5,y-5:y+5]

不过这样做会花费很多时间。
有没有更高效的方法来实现这个呢?
谢谢!

2 个回答

4

你可以用一种动态规划的方法来让这个过程快很多。首先,从矩阵的左上角开始,向右移动,然后再向下移动,把每个单元格的值设置为它自己加上上面的值(如果有的话)和左边的值(如果有的话)。当你到达右下角时,这个位置的值应该就是整个矩阵的总和。

for x in xrange(4000):
    for y in xrange(4000):
        c[x,y] = a[x,y]
        if x > 0:
            c[x,y] += c[x-1,y]
        if y > 0:
            c[x,y] += c[x,y-1]

现在,你可以通过从右上角减去左上角的值来得到任何矩形区域的总和。例如,在这个情况下,11x11区域的总和将是

c[x+5,y+5]-c[x-5,y-5]

然后你只需把这个总和除以窗口的大小,就能得到局部平均值:

b[x,y] = (c[x+5+,y+5]-c[x-5,y-5])/121

这样一来,你就不需要对矩阵中的每个元素检查121个位置,而只需对矩阵进行两次遍历,就能完成计算,而不需要对每个元素进行多次迭代。

8

你实际上想要的是一种二维卷积。Scipy可以帮你做到这一点:http://docs.scipy.org/doc/scipy/reference/generated/scipy.signal.convolve2d.html

事实上,这里在StackOverflow上也有一个类似的回答:使用python和numpy进行二维卷积

撰写回答