[英]2D local maxima and minima in Python
这是一个棘手的问题,因为您需要仔细定义最大值或最小值在相关之前需要多大“大”的概念。 例如,假设您有一个包含以下 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 小于周围的 5s。 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 使局部最大值成为近似值,因此您需要使用一些“近似”逻辑。 即,您将寻找“接近” 0 的值。接近的程度取决于您愿意允许局部极值的模糊程度。 综上所述,这里的两个 fudge 因子是 1. filter size 和 2. ~=0 fudge factor。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.