首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >圆形邻域-最小Numpy

圆形邻域-最小Numpy
EN

Stack Overflow用户
提问于 2015-04-15 11:41:23
回答 1查看 1.2K关注 0票数 1

我想在二维numpy数组上应用一个圆形邻域操作,其中每个像素值被圆形邻域内的最小值(radius = x)替换。

我可以应用一个基于内核的generic_filter,并得到最小值,但是操作需要一个方形的邻域,所以输出不正确。

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

代码语言:javascript
运行
复制
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。有什么方法可以优化这个吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-04-15 11:51:58

代码语言:javascript
运行
复制
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)
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29649280

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档