首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何让ndimage.filters.maximum_filter像MATLAB的imregionalmax函数一样工作?

如何让ndimage.filters.maximum_filter像MATLAB的imregionalmax函数一样工作?
EN

Stack Overflow用户
提问于 2019-05-14 23:34:30
回答 1查看 1.2K关注 0票数 3

在阅读this post,并使用SciKit-image之后,我发现Python语言与MATLAB的imregionalmax函数有不同之处。

我有以下几行代码:

代码语言:javascript
复制
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)

当我在MATLAB中得到变量giannisgiorgos时,我希望得到一个只有一个True值(2,4)的2D数组。取而代之的是,我取了不止一个最大值。

你知道为什么它是这样工作的吗,以及如何让它像MATLAB一样工作?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-05-15 01:26:55

giannisgiorgos的相似之处在于,它们找到的像素等于或大于3x3邻域中的其他像素。我相信giannis会有一些额外的阈值。

这两种方法都不能保证找到的像素实际上是局部最大值。注意我在上面说的“更大或相等”。图像中任何足够大的平台值(所有像素都具有相同值的区域)都将由算法标记,无论它们是局部最大值、局部最小值还是介于两者之间的某个地方。

例如:

代码语言:javascript
复制
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提供的一个实现是用DIPlib实现的(注意:我是一个作者):

代码语言:javascript
复制
import diplib as dip

nikos = dip.Maxima(manos)

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

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

代码语言:javascript
复制
nikos = skimage.morphology.local_maxima(manos)
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56134035

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档