python - 如何使 ndimage.filters.maximum_filter 像 MATLAB 的 imregionalmax 函数一样工作?

标签 python matlab image-processing scikit-image ndimage

阅读后this post ,并使用 SciKit-image 进行测试,我发现 Python 与 MATLAB 的函数 imregionalmax 之间存在差异。

我有这些代码行:

from skimage.feature import peak_local_max

manos = np.ones([5,5])
manos[2,2] = 0.
manos[2,4] = 2.

giannis = peak_local_max(manos,min_distance=1, indices=False, exclude_border=False)

giorgos = ndimage.filters.maximum_filter(manos, footprint=np.ones([3,3]))
giorgos = (giorgos == manos)

我希望变量 giannisgiorgos 的二维数组只有一个 True 值 ([2,4]),因为我得到在 MATLAB 中。相反,我采用了多个最大值。

知道为什么会这样工作以及如何让它像在 MATLAB 中一样工作吗?

最佳答案

giannisgiorgos 的相似之处在于它们都找到等于或大于 3x3 邻域中其他像素的像素。我相信 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()

A 1D "image" with plateaus, and the regions identified by the code above

请注意滤波器如何识别正弦曲线局部最小值附近的三个点。其中中间一个是实际的局部最小值,另外两个是既不是局部最大值也不是最小值的平台。

相比之下,MATLAB 函数 imregionalmax 会识别由具有较低值的像素包围的所有高原。执行此操作所需的算法与上面的算法非常不同。它可以使用并查算法有效地完成,或者使用泛洪填充型算法效率较低。主要思想是找到一个不低于任何邻居的像素,然后从它扩展到其等值邻居,直到探索整个高原或直到找到高原中具有更高值邻居的像素之一.

Python 提供的一个实现位于 DIPlib (注:我是作者):

import diplib as dip

nikos = dip.Maxima(manos)

pp.plot(manos);
pp.plot(nikos);
pp.show()

Same 1D image with correctly identified local maxima

另一个实现是in SciKit-Image (感谢Juanpointing this out):

nikos = skimage.morphology.local_maxima(manos)

关于python - 如何使 ndimage.filters.maximum_filter 像 MATLAB 的 imregionalmax 函数一样工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56134035/

相关文章:

python - 在 Python 类型中将枚举转换为文字类型别名

matlab - matlab中矩阵的所有组合

将十六进制 C 数组转换为 Matlab vector

matlab - 如何在 MATLAB 中使用交叉验证

Java:检测图像是 GIF 还是 sTIFF 并转换为 JPG

python - 在两个Python模块之间传递C函数指针

python - 从数据框中的列表添加新列但列表的值多于数据框中的总行数

python - 更改命令提示符的默认 python 版本

c++ - 翻转图像以获得镜像效果

performance - 提高二维图像 'tracing' CUDA 内核性能的技巧?