Python中的二维局部极大值和极小值

Python中的二维局部极大值和极小值,python,scikit-learn,scipy-optimize,scipy.ndimage,Python,Scikit Learn,Scipy Optimize,Scipy.ndimage,我有一个数据框,df,表示一个相关矩阵,这个热图带有示例极值。显然,每个点都有(x,y,值): 我正在研究得到局部极值。我查看了argrelextrema,在单独的行上进行了尝试,结果与预期的一样,但这对2D不起作用。我还研究了scipy.signal.find_peaks,但这是针对一维阵列的 Python中是否有任何东西会返回超过/低于特定值(阈值)的局部极值? 类似于(x,y,value)的数组?如果没有,那么你能给我指出正确的方向吗?这是一个棘手的问题,因为你需要仔细定义一个最大值或最

我有一个数据框,df,表示一个相关矩阵,这个热图带有示例极值。显然,每个点都有(x,y,值):

我正在研究得到局部极值。我查看了
argrelextrema
,在单独的行上进行了尝试,结果与预期的一样,但这对2D不起作用。我还研究了
scipy.signal.find_peaks
,但这是针对一维阵列的

Python中是否有任何东西会返回超过/低于特定值(阈值)的局部极值?
类似于(x,y,value)的数组?如果没有,那么你能给我指出正确的方向吗?

这是一个棘手的问题,因为你需要仔细定义一个最大值或最小值需要有多大的概念,然后才相关。例如,假设您有一个包含以下5x5像素网格的面片:

im = np.array([[ 0 0 0 0 0
                 0 5 5 5 0
                 0 5 4 5 0
                 0 5 5 5 0
                 0 0 0 0 0. ]])
这可能被视为局部最小值,因为4小于周围的5。OTOH,它可能被视为一个局部最大值,其中单个孤立的4像素只是“噪声”,平均强度为4.89像素的3x3块实际上是一个局部最大值。这通常被称为查看图像的“比例”

在任何情况下,都可以通过在一个方向上使用有限差分来估计该方向上的局部导数。
x
方向可能类似于:

k = np.array([[ -1 0 1 
                -1 0 1
                -1 0 1. ]])
将此过滤器应用于上面定义的图像修补程序将提供:

>>> cv2.filter2D(im, cv2.CV_64F, k)[1:-1,1:-1]
array([[  9.,   0.,  -9.],
       [ 14.,   0., -14.],
       [  9.,   0.,  -9.]])
在y方向应用一个类似的过滤器会将其转置。这里唯一一个在x和y方向上都是0的点是中间点,这是我们确定为局部最小值的4。这相当于检查x和y方向的梯度是否为0

整个过程可以扩展到找到我们已经确定的更大的单个局部最大值。您将使用更大的过滤器,例如

k = np.array([[ -2, -1, 0,  1,  2],
              [ -2, -1, 0,  1,  2], ...
由于4使局部最大值成为近似值,因此需要使用一些“近似”逻辑。i、 e.您将查找“接近”0的值。到底有多接近取决于你愿意允许局部极值的模糊程度。总之,这里的两个错误因素是1。过滤器大小和2~=0软糖因子