И giannis
, и giorgos
похожи в том, что они находят пиксели, которые равны или больше других пикселей в окрестности 3х3.Я полагаю, что giannis
будет иметь дополнительное пороговое значение.
Ни один из этих методов не гарантирует, что найденные пиксели на самом деле являются локальными максимумами.Обратите внимание, где я сказал «больше или равно» выше.Любое плато на вашем изображении (область, где все пиксели имеют одинаковое значение), достаточно большое, будет помечено алгоритмом, независимо от того, являются ли они локальными максимумами, локальными минимумами или где-то между ними.
Например:
import numpy as np
import matplotlib.pyplot as pp
import scipy.ndimage as ndimage
manos = np.sin(np.arange(100)/10)
manos = np.round(30*manos)/30 # Rounding to create plateaus
giorgos = ndimage.filters.maximum_filter(manos, footprint=np.ones([3]))
giorgos = (giorgos == manos)
pp.plot(manos);
pp.plot(giorgos);
pp.show()
Обратите внимание, как фильтр определил три точки вблизи локального минимума синусоиды.Средний из них является фактическим локальным минимумом, остальные два являются плато, которые не являются ни локальными максимумами, ни минимумами.
В отличие от этого, функция MATLAB imregionalmax
идентифицирует все плато, которые окружены пикселями с более низкимзначение.Алгоритм, необходимый для этого, сильно отличается от приведенного выше.Это может быть эффективно выполнено с использованием алгоритма Union-Find, или менее эффективно с использованием алгоритма типа заливки.Основная идея состоит в том, чтобы найти пиксель, который не ниже любого соседа, а затем расширить его до его равнозначных соседей, пока не будет исследовано все плато или пока вы не найдете один из пикселей на плато с более высоким соседом..
Единственная известная мне реализация этого алгоритма Одна реализация в Python находится в PyDIP (примечание: я автор; также обратите внимание: вы не можетевсе же установите это через pip
, вам нужно скомпилировать из исходников):
import PyDIP as dip
nikos = dip.Maxima(manos)
pp.plot(manos);
pp.plot(nikos);
pp.show()
Другая реализация в SciKit-Image (Спасибо Хуану за , указавшим на это ):
nikos = skimage.morphology.local_maxima(manos)