5

我试图找到给定图像的一些相对最大值。我知道有两种可能的方法,第一种是 using scipy.ndimage.maximum_filter(),第二种是 using skimage.feature.peak_local_max()

为了比较这两种方法,我修改了此处显示的 skimage 示例,以便比较找到的峰值。

from scipy import ndimage as ndi
import matplotlib.pyplot as plt
from skimage.feature import peak_local_max
from skimage import data, img_as_float

im = img_as_float(data.coins())

# use ndimage to find the coordinates of maximum peaks
image_max = ndi.maximum_filter(im, size=20) == im

j, i = np.where(image_max)
coordinates_2 = np.array(zip(i,j))

# use skimage to find the coordinates of local maxima
coordinates = peak_local_max(im, min_distance=20)

# display results
fig, axes = plt.subplots(1, 2, figsize=(8, 3), sharex=True, sharey=True)
ax = axes.ravel()

ax[0].imshow(im, cmap=plt.cm.gray)
ax[0].plot(coordinates_2[:, 0], coordinates_2[:, 1], 'r.')
ax[0].axis('off')
ax[0].set_title('Maximum filter')

ax[1].imshow(im, cmap=plt.cm.gray)
ax[1].autoscale(False)
ax[1].plot(coordinates[:, 1], coordinates[:, 0], 'r.')
ax[1].axis('off')
ax[1].set_title('Peak local max')

fig.tight_layout()

plt.show()

这给出了每种方法的下一个峰值: 图片

我知道参数sizeformaximum_filter不等于min_distancefrom peak_local_max,但我想知道是否有一种方法可以同时给出相同的结果。那可能吗?

关于stackoverflow的一些相关问题是:

获取二维数组中局部最大值的坐标高于某个值

二维阵列中的峰值检测

4

1 回答 1

3

你能想出一个解决方案吗?

我认为朝着这个方向迈出的一步就是简单地设置size=41最大过滤器。这给了我相当相似但不相同的结果。其背后的想法是在(来源:文档peak_local_max指定的区域中寻找峰值。2 * min_distance + 1

标识的大部分附加峰ndi.maximum_filter都靠近边界,但图片中间还有两个附加峰(附加峰标记为蓝色)。

假设peak_local_max采用一些逻辑来去除边界峰和接近其他峰的峰。很可能基于峰值的值。

于 2021-01-14T17:56:30.827 回答