圆形邻域 - 最小Numpy

时间:2015-04-15 11:41:23

标签: python arrays numpy neighbours

我想在2D numpy数组上应用圆形邻域运算,其中每个像素值被圆形邻域中的最小值(半径= x)替换。

我可以应用基于内核的generic_filter并获得最小值,但操作采用方形邻域,因此输出不正确。

我尝试过使用for循环并使用radius查找表执行操作,该表基本上是一个数组,它给出距第一个像素的距离,并使用if条件得到最小值。像这样:

import numpy as np

radiusGrid = np.random.randint(6, size=100).reshape(10,10)
radiusLUT = np.ones((6,6))

print radiusGrid

for i in xrange(6):
    for j in xrange(6):
        radiusLUT[i][j] = max(i,j) + (min(i,j)/2)

radius = 3

for y in xrange(10):
    intermediateGridRow = intermediateGrid[y]
    centerRadiusGridRow = radiusGrid[y]
    for x in xrange(10):
        startRow = max(y - radius,0)
        startCol = max(x - radius,0)
        endRow = min(y + radius +1, 10)
        endCol = min(x + radius +1, 10)
        minRadius = centerRadiusGridRow[x]
        for row in xrange(startRow,endRow):
            radiusGridRow = radiusGrid[row]
            radiusLUTRow = radiusLUT[abs(y-row)]
            for col in xrange(startCol,endCol):
                if radiusLUTRow[abs(x-col)] < radius and radiusGridRow[col] < minRadius:
                    minRadius = radiusGridRow[col]
        intermediateGridRow[x] = minRadius
    intermediateGrid[y] = intermediateGridRow

print intermediateGrid

以上建立的目标是在半径3范围内得到最小值。

for循环实现确实有效,但对于较大的数组来说速度很慢。我不倾向于使用Cython或f2py。有没有办法优化这个?

1 个答案:

答案 0 :(得分:3)

import numpy as np
from scipy.ndimage.filters import generic_filter as gf

kernel = np.zeros((2*radius+1, 2*radius+1))
y,x = np.ogrid[-radius:radius+1, -radius:radius+1]
mask = x**2 + y**2 <= radius**2
kernel[mask] = 1
#calculate
circular_min = gf(data, np.min, footprint=kernel)