使用ndimage.maximum_filter和skimage.peak_local_max找到图像峰值。

8 浏览
0 Comments

使用ndimage.maximum_filter和skimage.peak_local_max找到图像峰值。

我试图找到给定图像的一些相对最大值。我知道有两种可能的方法,第一种是使用scipy.ndimage.maximum_filter(),第二种是使用skimage.feature.peak_local_max()。\n为了比较这两种方法,我修改了一个来自skimage的示例,在这里展示,以便比较找到的峰值。\n

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())
# 使用ndimage找到最大峰值的坐标
image_max = ndi.maximum_filter(im, size=20) == im
j, i = np.where(image_max)
coordinates_2 = np.array(zip(i,j))
# 使用skimage找到局部最大值的坐标
coordinates = peak_local_max(im, min_distance=20)
# 显示结果
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('最大值滤波')
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('局部最大值')
fig.tight_layout()
plt.show()

\n这给出了每种方法的峰值:\n\"image\"\n我知道maximum_filtersize参数与peak_local_maxmin_distance参数不等效,但我想知道是否有一种方法可以使两者得到相同的结果。这可能吗?\n一些相关的stackoverflow问题:\n获取大于某个值的二维数组的局部最大值的坐标\n在二维数组中检测峰值

0
0 Comments

问题的出现原因是使用ndimage.maximum_filter方法得到的峰值点数量比skimage.peak_local_max方法得到的要多。解决方法是在maximum_filter方法中设置size=41,使得得到的结果与peak_local_max方法得到的结果相似。另外,peak_local_max方法中有一个参数exclude_border,默认值为min_distance,用于移除边界点,可以通过修改该参数解决问题。

0