圆形邻域 - 最小 Numpy
Circular Neighborhood - Minimum Numpy
我想对 2D numpy 数组应用圆形邻域操作,其中每个像素值都被圆形邻域(半径 = x)内的最小值替换。
我可以应用基于内核的 generic_filter 并获得最小值,但该操作采用方形邻域,因此输出不正确。
我尝试使用 for 循环并使用半径查找 table 执行操作,它基本上是一个数组,它给出与第一个像素的距离,并使用 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。有没有办法优化这个?
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)
我想对 2D numpy 数组应用圆形邻域操作,其中每个像素值都被圆形邻域(半径 = x)内的最小值替换。
我可以应用基于内核的 generic_filter 并获得最小值,但该操作采用方形邻域,因此输出不正确。
我尝试使用 for 循环并使用半径查找 table 执行操作,它基本上是一个数组,它给出与第一个像素的距离,并使用 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。有没有办法优化这个?
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)