Python中的二维局部极大值和极小值
我有一个数据框,df,表示一个相关矩阵,这个热图带有示例极值。显然,每个点都有(x,y,值): 我正在研究得到局部极值。我查看了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)的数组?如果没有,那么你能给我指出正确的方向吗?这是一个棘手的问题,因为你需要仔细定义一个最大值或最
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软糖因子