Ich versuche, einen lokalen Maxima-Filter auf einer Matrix zu berechnen, mit einem kreisförmigen Kern. Die Ausgabe sollte die Zellen sein, die lokale Maxima sind. Für jedes Pixel in der Eingabe "Daten" muss ich sehen, ob es ein lokales Maximum durch ein kreisförmiges Fenster ist und so einen Wert von 1 zurückgibt, sonst 0.Lokale Maxima mit kreisförmigen Fenster
Ich habe diesen Code, auf Antworten von hier aufgebaut: How to apply a disc shaped mask to a numpy array?
import numpy as np
import scipy.ndimage as sc
radius = 2
kernel = np.zeros((2*radius+1, 2*radius+1))
y,x = np.ogrid[-radius:radius+1, -radius:radius+1]
mask2 = x**2 + y**2 <= radius**2
kernel[mask2] = 1
def local_maxima(matrix, window_size):
loc_max = sc.maximum_filter(matrix, window_size, mode='constant')
return loc_max
data = np.array([(1, 1, 1, 1, 1, 1, 1, 1, 1), (1, 1, 1, 1, 1, 1, 1, 1, 1), (1, 1, 1, 1, 1, 1, 1, 1, 1),
(1, 1, 1, 1, 1, 1, 1, 1, 1), (1, 1, 1, 1, 4, 1, 1, 1, 1), (1, 1, 1, 1, 1, 1, 1, 1, 1),
(1, 1, 1, 1, 1, 1, 1, 1, 1), (1, 1, 1, 1, 1, 1, 1, 1, 1), (1, 1, 1, 1, 1, 1, 1, 1, 1),
(1, 1, 1, 1, 1, 1, 1, 1, 1)])
loc_max = sc.filters.generic_filter(data, local_maxima(data, np.shape(kernel)), footprint=kernel)
max_matrix = np.where(loc_max == data, 1, 0)
np.savetxt('.....\Local\Test_Local_Max.txt', max_matrix, delimiter='\t')
der Kernel hat diese Form:
[[ 0. 0. 1. 0. 0.]
[ 0. 1. 1. 1. 0.]
[ 1. 1. 1. 1. 1.]
[ 0. 1. 1. 1. 0.]
[ 0. 0. 1. 0. 0.]]
Also die Suche Zellen nur diejenigen sein, den Wert 1. die Zellen mit 0 sollten von der lokalen Maxima Suche ausgeschlossen werden.
Aber das Skript gibt den Fehler unten auf der Linie 21:
RuntimeError: function parameter is not callable
Vielen Dank für jede Hilfe!
Das Problem ist, dass die Funktion, die Sie 'sc.filters geben.generic_filter 'wird auf jedes Element des Eingabearrays angewendet, das Sie angeben:' data', was nicht möglich ist, da die Funktion local_maxima ein Array als Argument und nicht als float oder integer verwendet ... Ich weiß nicht genau, welches Ziel Sie haben Code, aber warum wenden Sie das nicht einfach an: 'loc_max = sc.maximum_filter (Daten, kernel.shape, mode = 'constant', footprint = kernel)' – bougui
Da der Footprint - Kernel nur die Positionen einnehmen sollte, die in der Kernel-Matrix, nicht die mit 0 auch. – Litwos