Я хочу применить круговую операцию окрестности в массиве 2D numpy, где каждое значение пикселя заменяется минимумом в пределах круговой окрестности (радиус = x).Циркулярное соседство - минимальное число
Я могу применить generic_filter, основанный на ядре, и получить минимум, но операция занимает квадратную окрестность, что дает неправильный вывод.
Я попытался использовать цикл for и выполнить операцию с использованием таблицы поиска радиуса, которая в основном представляет собой массив, который дает расстояние от первого пикселя и использует, если условия для получения минимума. Что-то вроде этого:
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.
для реализации петли делает работу, но медленно для больших массивов. Я не склонен использовать Cython или f2py. Есть ли способ оптимизировать это?
Запрашивать другие библиотеки не по теме для stackoverflow, но если вы включите свой код и попросите помочь улучшить его производительность, то у вас будет гораздо больше шансов получить некоторую помощь. – TheBlackCat