Круговая окрестность — минимум Numpy

Я хочу применить операцию кругового соседства к двумерному массиву numpy, где каждое значение пикселя заменяется минимумом в пределах кругового соседства (радиус = x).

Я могу применить generic_filter на основе ядра и получить минимум, но операция выполняется в квадратной окрестности, так что это дает неправильный результат.

Я попытался использовать цикл for и выполнить операцию, используя таблицу поиска радиуса, которая в основном представляет собой массив, который дает расстояние от первого пикселя и использует условия 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. Есть ли способ оптимизировать это?


person rsumbaly    schedule 15.04.2015    source источник
comment
Запрашивать другие библиотеки не по теме stackoverflow, но если вы включите свой код и попросите помочь улучшить его производительность, у вас будет гораздо больше шансов получить помощь.   -  person TheBlackCat    schedule 15.04.2015


Ответы (1)


person    schedule
comment
Вместо generic_filter можно использовать scipy.ndimage.filters.minimum_filter. - person Warren Weckesser; 15.04.2015
comment
Согласно документам, footprint является логическим массивом, поэтому вы должны иметь возможность передавать mask напрямую, не используя его для назначения массиву kernel с плавающей запятой. - person Jaime; 15.04.2015