Files
scikit-image/skimage/feature/peak.py
T
2012-02-02 22:33:57 -05:00

49 lines
1.3 KiB
Python

import numpy as np
from scipy import ndimage
def peak_local_max(image, min_distance=10, threshold=0.1):
"""Return coordinates of peaks in an image.
Peaks are the local maxima in a region of `2 * min_distance + 1`
(i.e. peaks are separated by at least `min_distance`).
Parameters
----------
image: ndarray of floats
Input image.
min_distance: int, optional
Minimum number of pixels separating peaks and image boundary.
threshold: float, optional
Candidate peaks are calculated as `max(image) * threshold`.
Returns
-------
coordinates : (N, 2) array
(row, column) coordinates of peaks.
"""
image = image.copy()
# Non maximum filter
size = 2 * min_distance + 1
image_max = ndimage.maximum_filter(image, size=size, mode='constant')
mask = (image == image_max)
image *= mask
# Remove the image borders
image[:min_distance] = 0
image[-min_distance:] = 0
image[:, :min_distance] = 0
image[:, -min_distance:] = 0
# find top corner candidates above a threshold
corner_threshold = np.max(image.ravel()) * threshold
image_t = (image >= corner_threshold) * 1
# get coordinates of peaks
coordinates = np.transpose(image_t.nonzero())
return coordinates